繁体   English   中英

正则表达式模式匹配顺序

[英]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结尾。” baaabbaaabcccb满足这个要求,但Javascript和Python都匹配后者。 我原以为它会匹配baaab ,因为该子字符串满足要求首先出现。

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

你可以通过添加一个?来使正则表达式不贪心? 之后*喜欢这样: b.*?b 然后它将匹配最小的字符串posible。 默认情况下,正则表达式是贪婪的,并将尝试找到最长的匹配。

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

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

这是一个关于这个的好教程,在贪婪与非贪婪的部分: google python类

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM