Java - 模式匹配奇怪的行为

时间:2013-01-21 14:46:09

标签: java regex

我必须执行部分模式匹配,因此我针对以下输入测试了模式匹配

Pattern p = Pattern.compile("hello");
Matcher m = p.matcher("[a-z]");

有人可以解释我为什么

System.out.println(m.find() || m.hitEnd());

时打印true
System.out.println(m.hitEnd());

打印false

3 个答案:

答案 0 :(得分:2)

<强>更新

因为m.find()本身完全处理模式,但找不到匹配(并返回false)。此调用后模式已完全耗尽,因此hitEnd()将生成true

在第二次调用中,模式未被使用,因此hitEnd()返回false

对于hitEnd(),Javadoc说:

  

如果在此匹配器执行的最后一次匹配操作中搜索引擎命中了输入的结尾,则返回true。

反映@jlordo的评论:也许你想更改模式和文字

Pattern p = Pattern.compile("[a-z]");
Matcher m = p.matcher("hello");

因为"[a-z]"看起来像一个模式。

答案 1 :(得分:2)

看看这个节目:

Pattern p = Pattern.compile("hello");
Matcher m = p.matcher("[a-z]");
System.out.println(m.hitEnd()); // prints false
System.out.println(m.find());  // prints false
System.out.println(m.hitEnd()); // prints true

注意,m.hitEnd()的第一次调用会返回false。看看JavaDoc,它说:

  

如果输入的结尾被搜索引擎击中,则返回true   该匹配器执行的最后一次匹配操作

这里它返回false,因为它在调用m.find()之前被调用,所以匹配器还没有执行任何匹配操作。调用m.find()后,它会返回true(因为find()会消耗完整的输入字符串而点击 结束)。其含义也在JavaDoc中解释:

  

当此方法返回true时,则可能有更多输入   会改变上次搜索的结果。

当返回true时,表示匹配器命中输入的末尾。在这种情况下,命中达到,不匹配。 (输入完全由匹配器消耗)。

修改

我希望您有意,[a-z]是正则表达式hello的输入字符串,而不是相反。如果你有

Pattern p = Pattern.compile("[a-z]"); // The regex needs to be compiled.
Matcher m = p.matcher("hello");       // The input is given to the matcher
while (m.find()) {                    // In this case, returns true 5 times
    System.out.println(m.group() + ", ");
}

您的输出将是

h, e, l, l, o, 

答案 2 :(得分:0)

System.out.println(m.find() || m.hitEnd());

m.find()返回一个布尔值 - 布尔值为false。我们刚刚处理了输入搜索的结尾 - 这使得m.hitend()结果为true。假||因此,true等于true。

上一个操作结束 - hitend()返回true if..well,这里是javadoc:

Returns true if the end of input was hit by the search engine in the last 
match operation performed by this matcher.

我们没有达到最后一次操作的结束。所以hitend()是假的。连续调用会导致错误。