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]");
指导你的是:
.*
在二郎集团。