在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
解释:
匹配单个数字\d
。
前面有加号或减号,+
或 -
。括号 ()
和竖线 |
可以用于交替,即当你想要这个或那个的时候。用竖线分隔所有选项:(+|-)
.
+
是运算符,因此必须转义:(\+|-)
.
不允许用于交替的括号通过在第一个括号后立即包含 ?:
来捕获值,现在看起来像 (?:\+|-)
。
使整个事情成为可选的 ?
。现在看起来像 (?:\+|-)?
.
将它们放在一起:(?:\+|-)?\d
。
并捕获:((?:\+|-)?\d)
.
使其成为全局匹配项 //g
以捕获所有匹配项:/((?:\+|-)?\d)/g
.
我有一些看起来像这样的 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
解释:
匹配单个数字\d
。
前面有加号或减号,+
或 -
。括号 ()
和竖线 |
可以用于交替,即当你想要这个或那个的时候。用竖线分隔所有选项:(+|-)
.
+
是运算符,因此必须转义:(\+|-)
.
不允许用于交替的括号通过在第一个括号后立即包含 ?:
来捕获值,现在看起来像 (?:\+|-)
。
使整个事情成为可选的 ?
。现在看起来像 (?:\+|-)?
.
将它们放在一起:(?:\+|-)?\d
。
并捕获:((?:\+|-)?\d)
.
使其成为全局匹配项 //g
以捕获所有匹配项:/((?:\+|-)?\d)/g
.