正则表达式模式匹配顺序

时间:2012-06-14 03:36:52

标签: javascript python regex

在我熟悉的所有语言的正则表达式引擎中,.*表示法表示匹配零个或多个字符。请考虑以下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结尾。” baaabbaaabcccb都满足此要求,但Javascript和Python都匹配后者。我希望它匹配baaab,因为该子字符串满足要求并且首先出现。

那么为什么在这种情况下模式匹配baaabcccb?并且,有没有办法修改此行为(使用任何一种语言),以便它匹配baaab

3 个答案:

答案 0 :(得分:6)

您可以在?之后添加*,使正则表达式不贪婪:b.*?b。然后它将匹配最小的字符串posible。默认情况下,正则表达式是贪婪的,并会尝试找到最长的匹配。

答案 1 :(得分:2)

.*是一场贪婪的比赛。 .*?是非贪婪的版本

答案 2 :(得分:2)

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

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