原子分组的交替是没用的?

gon*_*aao 4 regex perl

我知道很多关于原子分组的好答案,例如, 与原子分组的混淆 - 它与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);
Run Code Online (Sandbox Code Playgroud)

我在这里找到了一个解释,有点回答我的问题.

它(原子分组)告诉RegEx引擎,一旦找到匹配的子模式,就不会回溯任何可能在其中的量词或替代.

Luc*_*ski 6

在一般情况下,它并非无用.

它在您的示例中不起作用,因为第一个选项始终匹配,因此不会尝试第二个选项.并且引擎不会在原子组内部回溯,因为这几乎是原子组的目的.

如果你在一个原子组中有两个不相交的模式,将是完全合理的
(类似的东西(?>ab|cd)).