我对下面的正则表达式感到困惑。请帮我理解。
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”匹配。没有?
答案 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)
将匹配and
或or
,但不会匹配andor
。当您添加+
时,它将接受相同模式的两个(实际上是一个或多个)连续匹配,这使其匹配andor
。 (首先它匹配and
,然后匹配or
。)
答案 3 :(得分:3)
匹配原子时,它必须紧跟在前一个原子之后。
有两种“或”。
|
是独占的,或者如果它在fred
之后立即找到“或”或“和”,则会匹配。|
是包含性的,或者如果它在fred
之后立即找到“或”,“和”或两者,则会匹配。 and
之后无法立即找到or
和fred
,因此|
显然是排他性的。
答案 4 :(得分:1)
(和|或)+表示多次出现,但至少有一次出现。所以它也会匹配andand,andorand,orand,ororororand等。
(和|或)表示和或或。 (很好的名字)
所以它会匹配
弗雷德和浆果和
弗雷德或浆果 如果您想继续使用正则表达式,可以在找到正确的文档