我预计打印"[b]"
但它打印"[]"
:为什么看起来像Perl正则表达式中的*不是贪婪?
$x = "abc";
$x =~ /(b*)/;
print "[$1]";
如果恒星被替换为一个加号,它作为我期望的行为。不是两个都加上,明星应该是贪婪的?
新增:感谢大家指出(秒内,似乎!)认为,“B *”空字符串,第一次出现,其中是字符串甚至开始前一致。所以贪婪根本就不是问题。它甚至在到达第一个'b'之前匹配空字符串。
我预计打印"[b]"
但它打印"[]"
:为什么看起来像Perl正则表达式中的*不是贪婪?
$x = "abc";
$x =~ /(b*)/;
print "[$1]";
如果恒星被替换为一个加号,它作为我期望的行为。不是两个都加上,明星应该是贪婪的?
新增:感谢大家指出(秒内,似乎!)认为,“B *”空字符串,第一次出现,其中是字符串甚至开始前一致。所以贪婪根本就不是问题。它甚至在到达第一个'b'之前匹配空字符串。
这是贪婪的,但b*
将空字符串相匹配。 什么 *会如果打印$'
空串,所以,
"abc"
/\
--- matches the empty string here.
总是匹配你会看到它的ABC,这是比赛结束后的字符串的其余部分。贪婪仅仅意味着在“bbb”的情况下,你会得到“bbb”,而不是“b”或“bb”。
正则表达式匹配a(backtrack)
(这是因为在正则表达式回溯一个空值)和结束。用+
量词与a
或c
不匹配,因此$1
的值变为b
。
该模式将匹配并返回第一次b*
为真,即它将在a
处执行零宽度匹配。为了更清楚地说明这是怎么回事,这样做:
$x = "zabc";
$x =~ /(.b*)/;
print "[$1]";
正则表达式最早点字符串中匹配就可以了。在'abc'=〜/(b *)/的情况下,该点恰好在字符串的开头,它可以匹配零b。如果你曾试图匹配“BBC”,那么你就已经印:
[BB]
A *在模式的结尾几乎总是不是你想要的。我们甚至在学习Perl来解释这个问题。
尽早匹配具有比匹配的长度的更高的优先级(AFAIR这是Perl的正则表达式匹配引擎,这是一个NFA的情况下)。因此,在字符串开始处的零长度匹配比字符串中稍后的较长匹配更可取。
对于本article有关正则表达式匹配引擎的详细信息搜索“DFA VS NFA”。
不完全正确。它匹配并终止于`a`,而不是`c`。 – chaos 2009-07-12 21:30:16
啊对,我把它当作全球比赛来考虑。纠正。 – Blixt 2009-07-12 21:31:26