我正在尝试使用'java.util.regex.Pattern'从文本文件中捕获赋值操作。我一直非常沮丧地试图修复我的正则表达式以实际识别我正在寻找的东西。我尽可能地简化了问题,并发现了拾取空白区域的问题。
This post proved helpful,阐明了处理空白字符集的问题,但没有回答为什么以下内容不起作用的问题:
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=");
一切按预期工作!任何人都可以对出现的问题有所了解吗?
答案 0 :(得分:5)
从文档中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
。这就是问题所在。
答案 1 :(得分:2)
From Scanner.hasNext(Pattern) javadoc: 如果下一个完整标记与指定模式匹配,则返回true。完整的标记带有前缀,后缀为与分隔符模式匹配的输入。
在扫描程序中,默认空间是默认分隔符,因此在您的示例中,扫描程序会尝试将标记“adfa”与正则表达式匹配,该标记不匹配。如果您将分隔符更改为其他内容,例如换行符:
sc.useDelimiter("\n");
你的正则表达式应该可行。
编辑:我的回答有点晚了!