nodejs regex - 为什么我们需要“?”在以下正则表达式中

时间:2013-01-03 18:48:15

标签: regex node.js

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

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

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

^([^[]+?)

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

谢谢, 李

3 个答案:

答案 0 :(得分:2)

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

  • 可能会也可能不会

  • lazy匹配

ab?a,有或没有b(仅限一次)

但是采用以下格式:

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

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

修改

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

为什么?

因为你在搜索

从一开始----一切都不包括[,但搜索最小值。

那是你的a

但是在你做的时候

/^([^[]+?)(\[.*\])?$/.exec("abc[def]");
会议你的是:

在secong组中

.*

答案 1 :(得分:2)

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

此处提供了更多信息:http://www.regular-expressions.info/repeat.html

答案 2 :(得分:1)

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

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

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

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