1

我对以下正则表达式有疑问:

match = /^([^[]+?)(\[.*\])?$/.exec(path);

我不明白“?”的行为。在第一个表达式中:

^([^[]+?)

我的意思是,如果这个表达式是一个独立的正则表达式,并且路径是“abc[def]”,我会得到:“a”作为 match[1],对吧?(由于惰性匹配)。现在,当我添加第二个表达式时,match[1] 是:“abc”。你能解释一下区别吗?

谢谢,李

4

3 回答 3

2

如果你使用?你实际上是在说,

  • 可以不可以

  • lazy匹配

ab?a或无b(仅一次)

但以这种格式:

a+?是:“尝试搜索 a,但不要贪婪”

所以这里只会匹配 [aaaaaaa] 中的第一个 [a]。

编辑

/^([^[]+?)/.exec("abc[def]");  //["a", "a"]

这是为什么 ?

因为你在寻找

从一开始----一切不包括[但搜索最小的事件。

那是你的a

但是当你在做

/^([^[]+?)(\[.*\])?$/.exec("abc[def]");

让你印象深刻的是:

.*在第二组。

于 2013-01-03T18:54:23.940 回答
2

?+正则表达式引擎的行为交换为不贪婪之后。默认情况下,引擎会尝试匹配可用的最大字符串。随着尾随?它试图获得最短。

更多信息可在此处获得:http ://www.regular-expressions.info/repeat.html

于 2013-01-03T18:56:13.513 回答
1

?结构中的或+?导致*?其前面的运算符以非贪婪或懒惰的方式行事。这意味着它将消耗尽可能少的字符而不是尽可能多的字符(默认情况下)。

但是,在这个特定的正则表达式中,没有?改变行为的字符串。

/^([^[]+?)(\[.*\])?$/

由于第一组([^[]+?)必须跟在字符串的结尾或 a 之后[,并且第一组不能包含 a [,因此它将匹配整个字符串(如果其中没有[)或直到第一个[,或者它不会完全匹配。所以在这种情况下,贪婪+是无关紧要的。

于 2013-01-03T21:40:50.773 回答