我知道一个正面的正则表达式会到达文本的末尾,并且不会回溯以查看在结束之前是否存在匹配。如果最后有一个匹配则返回true,否则它会立即返回false。我是这样说的:
Pattern patt = Pattern.compile(".*+foo");
Matcher matcher = patt.matcher("xxfooxxxxxfooxxxfoo");
while (matcher.find())
System.out.println(matcher.group());
即使最后有一场比赛,它也没有给我任何帮助。有什么想法吗?
另外我理解为了使正则表达式懒惰/占有欲,我在第一个量词之后添加?/ +(即*?或* +)。是对的吗?谢谢!
答案 0 :(得分:3)
即使最后有一场比赛,它也没有给我任何帮助。有什么想法吗?
.*+
将匹配整个输入字符串(包括最后一个foo
)。并且因为它不会从字符串的末尾回溯,所以正则表达式.*+foo
不匹配。
另外我理解为了使正则表达式懒惰/占有欲,我在第一个量词之后添加?/ +(即*?或* +)。是吗?
占有欲的反对部分不懒惰。这将是贪婪的,默认为*
。
因此,正则表达式.*?foo
将匹配"xxfoo"
,而正则表达式.*foo
将匹配"xxfooxxxxxfooxxxfoo"
。
答案 1 :(得分:1)
占有量词不会放弃回溯的匹配。 .*+
与您的整个字符串匹配,然后foo
无法匹配。
只有在您知道匹配的内容永远不会被回溯时才使用占有量词(例如,[^f]*+.*foo
,或者,如果您知道,那么唯一的“f”字符将位于“foo”的开头,[^f]*+foo
)。