1

我正在尝试使用“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=");

一切按预期工作!任何人都可以阐明发生了什么问题吗?

4

2 回答 2

5

从文档中,Scanner#hasNext(Pattern): -

如果下一个完整的标记与指定的模式匹配,则返回 true。完整的标记由匹配分隔符模式的输入添加前缀和后缀。

现在,由于默认的分隔符模式Scanner\p{javaWhitespace}+. 通过使用方法找出它Scanner#delimiter(): -

Scanner sc = new Scanner("abdc =");
System.out.println(sc.delimiter());  // Prints \p{javaWhitespace}+

因此,当您在字符串中Scanner遇到 a时。whitespace它假设token已经结束。因此停在那里,并尝试将读取的令牌与您的模式匹配。当然它失败了,因此sc.hasNext(p)return false。这就是问题。

于 2013-01-22T23:19:10.743 回答
2

Scanner.hasNext(Pattern) javadoc: 如果下一个完整标记与指定模式匹配,则返回 true。完整的标记由匹配分隔符模式的输入添加前缀和后缀。

在 Scanner 中,withespace 是默认分隔符,因此在您的示例中,Scanner 尝试将令牌“adfa”与不匹配的正则表达式匹配。如果您将分隔符更改为其他内容,例如换行符:

sc.useDelimiter("\n");

您的正则表达式应该可以工作。

编辑:我的回答有点晚了!

于 2013-01-22T23:28:47.320 回答