[英]Regular Expression Pattern Matching order
在我熟悉的所有语言的正则表达式引擎中, .*
表示法表示匹配零个或多个字符。 请考虑以下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
。 然后它将匹配最小的字符串posible。 默认情况下,正则表达式是贪婪的,并将尝试找到最长的匹配。
.*
是一场贪婪的比赛。 .*?
是非贪婪的版本
因为*和+本质上是贪婪的(至少在python中,我不确定js)。 他们会尽量匹配。 如果你想避免这个问题你可以添加? 在他们之后。
这是一个关于这个的好教程,在贪婪与非贪婪的部分: google python类
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.