在我熟悉的所有语言的正则表达式引擎中,.*
符号表示匹配零个或多个字符。考虑以下 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
相匹配?
最佳答案
您可以通过在 *
之后添加 ?
来使正则表达式不贪婪,如下所示:b.*?b
。然后它将匹配可能的最小字符串。默认情况下,正则表达式是贪婪的,会尝试找到最长的匹配项。
关于javascript - 正则表达式模式匹配顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11026322/