Dae*_*den 1 java regex whitespace
我正在尝试使用'java.util.regex.Pattern'从文本文件中捕获赋值操作.我一直非常沮丧地试图修复我的正则表达式以实际识别我正在寻找的东西.我尽可能地简化了问题,发现了拾取空白区域的问题.
这篇文章证明是有帮助的,并阐明了处理空白字符集的问题,但没有回答为什么以下不起作用的问题:
Pattern p = Pattern.compile("adfa =");
Scanner sc = new Scanner("adfa =");
if(sc.hasNext(p))
{
String s = sc.next(p);
System.out.println(">" + s + "<");
}
else
System.out.println(":(");
Run Code Online (Sandbox Code Playgroud)
如果我试试这个:
Pattern p = Pattern.compile("\\w+ *=");
Run Code Online (Sandbox Code Playgroud)
拾取以下字符串:
"adfa="
Run Code Online (Sandbox Code Playgroud)
但不是:
"adfa ="
Run Code Online (Sandbox Code Playgroud)
只需进行以下更改:
Pattern p = Pattern.compile("adfa=");
Scanner sc = new Scanner("adfa=");
Run Code Online (Sandbox Code Playgroud)
一切正常!任何人都可以解决出错的问题吗?
从文档中,Scanner#hasNext(Pattern)
: -
如果下一个完整标记与指定模式匹配,则返回true.一个完整的标记是前缀,后缀是与分隔符模式匹配的输入.
现在,因为默认的分隔符模式Scanner
是\p{javaWhitespace}+
.使用Scanner#delimiter()
方法找出它: -
Scanner sc = new Scanner("abdc =");
System.out.println(sc.delimiter()); // Prints \p{javaWhitespace}+
Run Code Online (Sandbox Code Playgroud)
所以,当你Scanner
遇到whitespace
你的字符串时.它假设token
已经结束.因此停在那里,并尝试将读取令牌与您的模式匹配.当然它失败了,因此又sc.hasNext(p)
回来了false
.这就是问题.