我有一些看起来如此的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尝试了正则表达式。
答案 0 :(得分:3)
不要在匹配中包含您不想要的字符,只需对单个数字模式执行全局匹配,加号或减号是可选的。
my $text = "!random 3d4+5-6";
my @matches = $text =~ /((?:\+|-)?\d)/g;
print "@matches";
# 3 4 +5 -6
说明:
匹配单个数字\d
。
前加上或加号,+
或-
。括号()
和管道|
可用于交替,即您想要这个或那个。用管道分隔所有备选方案:(+|-)
。
+
是一个运算符,因此必须转义:(\+|-)
。
不要允许用于替换的括号通过在第一个paren之后立即包含?:
来捕获值,现在看起来像(?:\+|-)
。
使整个事物成为可选?
。现在看起来像(?:\+|-)?
。
将它们放在一起:(?:\+|-)?\d
。
捕获:((?:\+|-)?\d)
。
将其设为全局匹配//g
以捕获所有出现次数:/((?:\+|-)?\d)/g
。