我对以下正则表达式有疑问:
match = /^([^[]+?)(\[.*\])?$/.exec(path);
我不明白“?”的行为在第一个表达式中:
^([^[]+?)
我的意思是,如果这个表达式是一个独立的正则表达式,并且路径是“abc [def]”,我会得到:“a”作为匹配[1],对吧? (由于懒惰的比赛)。 现在,当我添加第二个表达式时,匹配[1]是:“abc”。 你能解释一下这个区别吗?
谢谢, 李
答案 0 :(得分:2)
如果您使用?
,实际上是在说,
可能会也可能不会
lazy
匹配
ab?
为a
,有或没有b
(仅限一次)
但是采用以下格式:
a+?
是:“尝试搜索但不要贪婪”
所以这里只有[aaaaaa]中的第一个[a]匹配。
/^([^[]+?)/.exec("abc[def]"); //["a", "a"]
为什么?
因为你在搜索
从一开始----一切都不包括[
,但搜索最小值。
那是你的a
但是在你做的时候
/^([^[]+?)(\[.*\])?$/.exec("abc[def]");
会议你的是:
在secong组中 .*
。
答案 1 :(得分:2)
?
之后+
将正则表达式引擎的行为交换为ungreedy。默认情况下,引擎会尝试匹配可用的最大字符串。尾随?
它会尝试获得最短的结果。
答案 2 :(得分:1)
?
或+?
之类的构造中的*?
会使其前面的运算符以非贪婪或懒惰的方式运行。这意味着它将消耗尽可能少的字符而不是尽可能多的字符(默认情况下)。
但是,在这个特殊的正则表达式中,没有?
改变行为的字符串。
/^([^[]+?)(\[.*\])?$/
由于第一个组([^[]+?)
必须后跟字符串的结尾或[
且第一个组不能包含[
,因此它将匹配整个字符串(如果其中没有[
)或第一个[
,或者根本不匹配。所以在这种情况下,+
的贪婪是无关紧要的。