理解占有量词,java正则表达式

时间:2011-06-26 18:39:59

标签: java regex

我知道一个正面的正则表达式会到达文本的末尾,并且不会回溯以查看在结束之前是否存在匹配。如果最后有一个匹配则返回true,否则它会立即返回false。我是这样说的:

Pattern patt = Pattern.compile(".*+foo");
Matcher matcher = patt.matcher("xxfooxxxxxfooxxxfoo");
while (matcher.find())
    System.out.println(matcher.group());

即使最后有一场比赛,它也没有给我任何帮助。有什么想法吗?

另外我理解为了使正则表达式懒惰/占有欲,我在第一个量词之后添加?/ +(即*?或* +)。是对的吗?谢谢!

2 个答案:

答案 0 :(得分:3)

  

即使最后有一场比赛,它也没有给我任何帮助。有什么想法吗?

.*+将匹配整个输入字符串(包括最后一个foo)。并且因为它不会从字符串的末尾回溯,所以正则表达式.*+foo不匹配。

  

另外我理解为了使正则表达式懒惰/占有欲,我在第一个量词之后添加?/ +(即*?或* +)。是吗?

占有欲的反对部分懒惰。这将是贪婪的,默认为*

因此,正则表达式.*?foo将匹配"xxfoo",而正则表达式.*foo将匹配"xxfooxxxxxfooxxxfoo"

答案 1 :(得分:1)

占有量词不会放弃回溯的匹配。 .*+与您的整个字符串匹配,然后foo无法匹配。

呃,像巴特说的那样。 :)

只有在您知道匹配的内容永远不会被回溯时才使用占有量词(例如,[^f]*+.*foo,或者,如果您知道,那么唯一的“f”字符将位于“foo”的开头,[^f]*+foo)。

相关问题