4

在我熟悉的所有语言的正则表达式引擎中,.*符号表示匹配零个或多个字符。考虑以下 Javascript 代码:

var s = "baaabcccb";
var pattern = new RegExp("b.*b");
var match = pattern.exec(s);
if (match) alert(match);

这输出baaabcccb

Python也会发生同样的事情:

>>> import re
>>> s = "baaabcccb"
>>> m = re.search("b.*b", s)
>>> m.group(0)
'baaabcccb'

这两种语言都匹配"baaabcccb"而不是简单的原因是什么"baaab"?我阅读模式的方式b.*b是“找到一个以 开头的子字符串b,然后包含任意数量的其他字符,然后以 . 结尾b。” 两者都baaab满足baaabcccb这个要求,但 Javascript 和 Python 都匹配后者。我本来希望它 match baaab,仅仅是因为该子字符串满足要求首先出现。

那么为什么baaabcccb在这种情况下模式匹配呢?而且,有没有办法修改这种行为(在任何一种语言中),以使其匹配baaab

4

3 回答 3

6

?您可以通过在*这样的后面添加 a 来使正则表达式不贪心: b.*?b。然后它将匹配可能的最小字符串。默认情况下,正则表达式是贪婪的,并会尝试找到最长的匹配项。

于 2012-06-14T03:39:02.007 回答
2

.*是一个贪婪的匹配。.*?是非贪婪版本

于 2012-06-14T03:39:43.910 回答
2

因为 * 和 + 本质上是贪婪的(至少在 python 中,我不确定 js)。他们会尽量匹配。如果你想避免这个问题,你可以添加?在他们之后。

这是一个很棒的教程,在贪婪与非贪婪部分: google python class

于 2012-06-14T03:40:38.507 回答