我知道很多关于原子分组的好答案,例如Confusion with Atomic Grouping - how it differs from the Grouping in regular expression of Ruby?
我的问题很简单:所以原子分组的交替是没用的,对吧?
一些例子:
a(?>bc|b)c
永远不会与abc
匹配,实际上它永远不会在b
()
(?>.*|b*)[ac]
永远不会匹配任何字符串,因为.*
匹配所有字符串并被丢弃。我明白吗?
perl
中的一些测试代码,以防它可能有用
sub tester {
my ($txt, $pat) = @_;
if ($txt =~ $pat) {
print "${pat} matches ${txt}\n";
} else {
print "No match\n";
}
}
$txt = "abcc";
$pat = qr/a(?>bc|b)c/;
tester($txt, $pat);
$txt = "bbabbbabbbbc";
$pat = qr/(?>.*)c/;
tester($txt, $pat);
$pat = qr/(?>.*|b*)[ac]/;
tester($txt, $pat);
$txt = "abadcc";
$pat = qr/a(?>b|dc)c/;
tester($txt, $pat);
我在here中找到了一个解释我的问题的解释。
它(原子分组)告诉RegEx引擎,一旦找到匹配的子模式,就不会回溯任何可能在其中的量词或替代品。
答案 0 :(得分:6)
在一般情况下,它没有用处。
它不适用于您的示例,因为第一个选项始终匹配,因此第二个选择不会被尝试。并且引擎不会在原子组内部回溯,因为这几乎是原子组的目的。
如果原子组中有两个不相交的模式,那么 将完全合理
(类似于(?>ab|cd)
)。