我正在尝试使用"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(":(");
如果我尝试这个:
Pattern p = Pattern.compile("\w+ *=");
选取以下字符串:
"adfa="
但不是:
"adfa ="
只需进行以下更改:
Pattern p = Pattern.compile("adfa=");
Scanner sc = new Scanner("adfa=");
一切按预期工作!谁能说明出了什么问题?
从文档中,Scanner#hasNext(Pattern)
: -
如果下一个完整标记与指定的模式匹配,则返回 true。 完整的令牌由与 分隔符模式。
现在,由于Scanner
的默认分隔符模式是 p{javaWhitespace}+
.使用Scanner#delimiter()
方法找出答案:-
Scanner sc = new Scanner("abdc =");
System.out.println(sc.delimiter()); // Prints p{javaWhitespace}+
因此,当您的Scanner
遇到字符串中的whitespace
时。它假定token
已结束。因此,它停在那里,并尝试将读取令牌与您的模式匹配。当然,它失败了,因此sc.hasNext(p)
返回false
.这就是问题所在。
来自 Scanner.hasNext(Pattern) javadoc:如果下一个完整标记与指定的模式匹配,则返回 true。完整的标记由与分隔符模式匹配的输入作为前缀和后缀。
在扫描仪中,withespace 是默认分隔符,因此在您的示例中,扫描仪尝试将令牌"adfa"与不匹配的正则表达式匹配。如果将分隔符更改为其他内容,例如换行符:
sc.useDelimiter("n");
您的正则表达式应该可以工作。
编辑:我的回答有点晚了!