【问题标题】:Alternation in atomic grouping is useless?原子分组的交替没有用吗?
【发布时间】:2016-04-04 22:28:55
【问题描述】:

我知道许多关于原子分组的好答案,例如,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 引擎,一旦它找到匹配的子模式,就不要回溯任何可能在其中的量词或替代项。

【问题讨论】:

    标签: regex perl


    【解决方案1】:

    一般情况下也不是没用。

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

    如果您在一个原子组中有两个 不相交 模式, 将非常有意义
    (类似于(?>ab|cd))。

    【讨论】:

    • 那么trying alternativesbacktracking是两个不同的概念或过程?
    • 回溯是当前状态不允许引擎进一步匹配时发生的情况。在这种情况下,它需要尝试另一种解决方案(例如,它可以在交替中尝试不同的选择)。原子组被视为单个实体,在给定位置匹配或不匹配。一旦匹配,它只能以一种唯一的方式匹配。
    • 所以实际上正则表达式中的所有替代项都将被尝试,但文本中先前匹配的字符串将不会再次匹配(即没有回溯)。这是更近的地方吗?
    • 我更新了一个例子来说明我的理解。
    • 准确地说是“不相交”:它意味着子模式不能在同一位置匹配相同的文本。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-06-24
    • 2011-09-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多