正则表达式模式匹配顺序

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都匹配后者。 我原本期待它匹配"baaab",因为该子字符串既满足要求,又出现在前面。
那么,为什么这个模式会在这种情况下匹配"baaabcccb"呢?是否有任何方法可以修改这种行为(无论是在哪种语言中)以便它匹配"baaab"而不是"baaabcccb"?
3个回答

6

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


默认情况下,它是贪婪的,这意味着正则表达式将尝试匹配可能最长的字符串。 - David

2

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


2

因为在Python中,*和+都是贪婪的,它们会尝试尽可能多地匹配。如果您想避免这个问题,可以在它们后面添加?

在贪婪与非贪婪部分,这里有一个很棒的教程: Google Python Class


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接