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