如何使用java正则表达式中的替换使原子组工作?

时间:2014-06-08 14:17:45

标签: java regex

我见过原子组的简单演示。正则表达式:

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中的原子组?

1 个答案:

答案 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}}