在perl中获取任意数量的匹配项

时间:2015-04-14 23:07:38

标签: regex perl match

我有一些看起来如此的perl代码:

my @matches = $text =~ /^!random ([0-9]+?)d([0-9]+?)([+-][0-9]+?)*$/i

其中text是包含一些任意文本的字符串(我从IRC服务器收到的。理论上,这应该得到所有匹配,但它只存储匹配组1,组2和最后一个匹配3。因此,如果$ text包含"!random 3d4 + 5-6",匹配将是" 3"," 4"和" 6&#34我怎样才能使比赛成为" 3"," 4"," + 5"," -6" ?请注意,我也使用/ gim尝试了正则表达式。

1 个答案:

答案 0 :(得分:3)

不要在匹配中包含您不想要的字符,只需对单个数字模式执行全局匹配,加号或减号是可选的。

my $text = "!random 3d4+5-6";
my @matches = $text =~ /((?:\+|-)?\d)/g;
print "@matches";
# 3 4 +5 -6

https://eval.in/313604


说明:

匹配单个数字\d

前加上或加号,+-。括号()和管道|可用于交替,即您想要这个或那个。用管道分隔所有备选方案:(+|-)

+是一个运算符,因此必须转义:(\+|-)

不要允许用于替换的括号通过在第一个paren之后立即包含?:来捕获值,现在看起来像(?:\+|-)

使整个事物成为可选?。现在看起来像(?:\+|-)?

将它们放在一起:(?:\+|-)?\d

捕获:((?:\+|-)?\d)

将其设为全局匹配//g以捕获所有出现次数:/((?:\+|-)?\d)/g