为什么非捕获组没有按照定义循环?

时间:2016-02-25 07:41:26

标签: regex perl

给定目标字符串

a{b}{c}{d}

我正在寻找一个返回的正则表达式:bcd{}之间的值。

我使用了以下正则表达式:[^{}]+(?:{([^{}]+)})+ 但它只返回最后一个值d

我还试图通过将第一个匹配部分[^{}]+更改为[^{}]+?来使其变得懒惰,但没有区别。

为什么非捕获组不支持+量词? 你能建议一个有效的正则表达式吗?

修改

继续查看并使用以下来自WiktorStribiżew的回答我发现以下更加简单的([^{}]+)/g,它返回所有不带{}的字符串,我可以轻松跳过第一项(开头的字符串)

1 个答案:

答案 0 :(得分:0)

您不需要量化的捕获组,因为找到每个连续的组值,前一个值被重写(正好您所观察到的)。使用{([^{}]+)}正则表达式模式(捕获{}之间的内容)和/g修饰符来查找多个匹配项:

#!/usr/bin/perl
use warnings;
use feature 'say';

$s = "a{b}{c}{d}";
my @res = ($s) =~ /{([^{}]+)}/g;
say "@res";

请参阅IDEONE demo

正则表达式细分:

  • { - 打开文字大括号
  • ([^{}]+) - 第1组:{}以外的一个或多个字符(因此,在{...}内,不能有{如果这不是您所需要的,请替换为([^}]+)
  • } - 关闭文字大括号

注意:如果您使用/([^{}]+)/g regex,它将匹配由{}以外的字符组成的所有子字符串,因此会捕获超过{...}只是{{1}}

中的文字