2

为什么会这样?我有一个复杂的正则表达式,但这就是让我发疯的原因。

a|b

匹配 singlea或 single b

a+|b+

匹配系列a或 系列b.

a{1}|b{1}

匹配两个相同的单个字母。

但我需要这样做:

a{0,2}|b{0,2}

这个正则表达式只匹配a,根本不匹配b。那有什么问题?

更有趣的是,如果我将 , 更改01,它{1,2}会再次开始正确匹配(或更好,如预期的那样)。

由于现在看起来很清楚,我添加了我的真实示例:

my $launch_regexp = '(\d*)d{0,1}(\d*)(\+{0,2}|-{0,2})(\d*)';
($dice, $fc, $op, $mod) = ($launch =~ /$launch_regexp/);

哪里$launch是一样的$ARGV[1]

我想匹配很多东西。例子:

3 (numbers)

d10 (d + numbers)

3d10 (numbers + d + numbers)

3d10+/-5 (numbers + d + numbers + (+|-) + numbers)

3d10++/--5 (numbers + d + numbers + (++|--) + numbers)

我知道我的正则表达式也匹配其他字符串,但现在它适用于+而不适用于-.

如果我用 更改范围{1,2},它将匹配带有 + 和 - 的字符串(但我还需要匹配没有此类修饰符的字符串)。

这发生在我使用 Perl 5.16.3 的机器上,我可以在这个网站上重现它。

4

2 回答 2

7

正则表达式可以匹配字符串“b”,a{0,2}因为它正确地有零个“a”实例。它不会捕获,但会匹配。

为了匹配 ''、'aa' 或 'bb',您需要(aa|bb)?将整个正则表达式包装在^$

我认为您想要的解决方案是:(\d*)d?(\d+)(?:(\+{1,2}|\-{1,2})(\d*))?

于 2013-10-08T21:37:54.213 回答
2

Perl 更喜欢字符串中最早的匹配而不是其他任何东西。接下来,它更喜欢一系列|替代方案中最早的一个(不是最长的,就像一些正则表达式引擎的情况一样)。因为你的第一个选项不能匹配任何内容,perl 将在字符串的开头这样做,对于任何不以 a 开头的字符串。

你可能想要这样的东西:

my ($find) = ($string) =~ /^[^ab]*(a{1,2}|b{1,2}|\z)/;
于 2013-10-08T22:10:10.073 回答