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

Obtain arbitrary number of matches in perl

我有一些看起来像这样的 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”。我怎样才能使匹配项为“3”、“ 4", "+5", "-6"? 请注意,我也尝试过使用 /gim 的正则表达式。

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

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

https://eval.in/313604


解释:

匹配单个数字\d

前面有加号或减号,+-。括号 () 和竖线 | 可以用于交替,即当你想要这个或那个的时候。用竖线分隔所有选项:(+|-).

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

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

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

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

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

使其成为全局匹配项 //g 以捕获所有匹配项:/((?:\+|-)?\d)/g.