nodejs正则expression式 – 为什么我们需要在下面的正则expression式“?”

我有一个关于下面的正则expression式的问题:

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

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

 ^([^[]+?) 

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

谢谢你,李

这个? 在build设像+?*? 导致前面的操作符以非贪婪或懒惰的方式performance。 这意味着它会消耗尽可能less的字符,而不是尽可能多(默认情况下)。

然而,在这个特定的正则expression式中, 改变行为。

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

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

这个? 之后+交换正则expression式引擎的行为是不合理的。 默认情况下,引擎会尝试匹配可用的最大string。 随着尾随? 它试图得到最短的。

更多信息可在这里find: http : //www.regular-expressions.info/repeat.html

如果你使用? 你其实是在说,

  • 可以不可以

  • lazy匹配

ab? 是有或没有b (只有一次)

但以这种格式:

a+? 是:“尝试search一下,但不要贪婪”

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

编辑

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

这是为什么 ?

因为你正在寻找

从一开始—-一切都不包括[但search最小的出现。

那你的a

但是当你在做

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

指导你的是:

.*在二郎集团。