我见过原子组的简单演示。正则表达式:
a(?>bc|b)d
我尝试在java 7上运行它并且它没有按预期工作,因为它在此演示中匹配:
Pattern pattern = Pattern.compile("a(?>bc|b)d");
Matcher matcher = pattern.matcher("abd");
System.out.println("matches="+matcher.matches());
打印:
matches=true
但原子团要避免尝试所有替代方案。
如何启用java中的原子组?
答案 0 :(得分:2)
您似乎误解了http://www.regular-expressions.info/atomic.html
中的示例您需要了解原子组的目的是防止回溯,因此无法使用新子字符串更改已匹配的子字符串。但是对于第一次交替的情况不会找到匹配,那么可以测试下一次交替的情况。
因此对于字符串abd
和正则表达式a(?>bc|b)c
regex parts | matched String parts
---------------+----------------------
a | a
(?>bc|b) | b - it happens because `bc` can't be matched so next case
| from alternation inside atomic group is used
d | d
如果来自链接文章a(?>bc|b)c
和字符串abc
的正则表达式,您将获得
regex parts | matched String parts
---------------+----------------------
a | a
(?>bc|b) | bc <--------+
c | nothing - c was already matched and "possessed" by atomic
| group so `c` can't be used here
并且因为c
a(?>bc|b)c
^
无法匹配,false
"abc".matches("a(?>bc|b)c")
{{1}}