使用时,两个备选方案是否匹配在Perl正则表达式?

时间:2011-09-01 02:51:44

标签: regex perl

我对下面的正则表达式感到困惑。请帮我理解。

my $test = "fred andor berry";
if ($test =~ /fred (and|or) berry/) {
    print "Matched!\n";
} else {
      print "Did not match!\n";
}

我认为它会匹配,但我得到“不匹配!”。如果我在其中添加+,就像这样,

my $test = "fred andor berry";
if ($test =~ /fred (and|or)+ berry/) {
   print "Matched!\n";
} else {
   print "Did not match!\n";
}

然后匹配。我以为我可以使用and|or将表达式与“and”,“or”和“andor”匹配。没有?

5 个答案:

答案 0 :(得分:11)

正则表达式(and|or)的部分意味着匹配'和'或'或'但不是两者。将加号附加到该组后,它可以匹配一次或多次。例如,“fred andandand berry”也是/fred (and|or)+ berry/

的有效匹配

答案 1 :(得分:4)

虽然人们倾向于将a|b视为“a或b”,但|不是OR运算符;它是交替运算符。它为那时可以匹配的内容指定了一组替代。更准确的读数将是“要么'a'或'b'(而不是两者)”。

当你写(and|or)+时,你正在添加+量词,这意味着“一个或多个前面的原子”。效果是,不是匹配可以是“和”或“或”的单个值,而是匹配一系列值,每个值可以是“和”或“或”。它将匹配以下所有内容:

and
or
andor
orand
andorand
andandorororandorandand

如果你真的想要只匹配“和”,“或”和“andor”(虽然我不知道你为什么想要),你会这样写:

(and|or|andor)    # capture
(?:and|or|andor)  # don't capture

取决于您是否要捕获匹配的特定值。 (普通(...)创建捕获分组。(?:...)创建非捕获分组。)

答案 2 :(得分:3)

表达式(and|or)将匹配andor,但不会匹配andor。当您添加+时,它将接受相同模式的两个(实际上是一个或多个)连续匹配,这使其匹配andor。 (首先它匹配and,然后匹配or。)

答案 3 :(得分:3)

匹配原子时,它必须紧跟在前一个原子之后。

有两种“或”。

  • 独家或
  • 包容或

  • 如果|是独占的,或者如果它在fred之后立即找到“或”或“和”,则会匹配。
  • 如果|是包含性的,或者如果它在fred之后立即找到“或”,“和”或两者,则会匹配。

and之后无法立即找到orfred,因此|显然是排他性的。

答案 4 :(得分:1)

(和|或)+表示多次出现,但至少有一次出现。所以它也会匹配andand,andorand,orand,ororororand等。

(和|或)表示和或或。 (很好的名字)

所以它会匹配

弗雷德和浆果

弗雷德或浆果

如果您想继续使用正则表达式,可以在

找到正确的文档

http://perldoc.perl.org/perlre.html