Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/40.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex nodejs正则表达式-为什么我们需要“引用”&引用;在下面的正则表达式中_Regex_Node.js - Fatal编程技术网

Regex nodejs正则表达式-为什么我们需要“引用”&引用;在下面的正则表达式中

Regex nodejs正则表达式-为什么我们需要“引用”&引用;在下面的正则表达式中,regex,node.js,Regex,Node.js,我对以下正则表达式有一个问题: match = /^([^[]+?)(\[.*\])?$/.exec(path); 我不明白第一个表达式中“?”的行为: ^([^[]+?) 我的意思是,如果这个表达式是一个独立的正则表达式,路径是“abc[def]”,我会得到匹配[1]的“a”,对吗?(由于懒惰的比赛)。 现在,当我添加第二个表达式时,match[1]是:“abc”。 你能解释一下区别吗 谢谢, Li如果你使用?你实际上是在说 可以,也可以不可以 lazy匹配 ab?是a带或不带b(

我对以下正则表达式有一个问题:

match = /^([^[]+?)(\[.*\])?$/.exec(path);
我不明白第一个表达式中“?”的行为:

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

谢谢,
Li

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

  • 可以,也可以不可以

  • lazy
    匹配

ab?
a
带或不带
b
(仅一次)

但在这种形式下:

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

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

编辑 为什么呢

因为你在寻找

从一开始——一切不包括
[
,而是搜索最小发生次数

这就是你的
a

但是当你在做

/^([^[]+?)(\[.*\])?$/.exec("abc[def]");
使用您的是:


*
在secong组中。

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

  • 可以,也可以不可以

  • lazy
    匹配

ab?
a
带或不带
b
(仅一次)

但在这种形式下:

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

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

编辑 为什么呢

因为你在寻找

从一开始——一切不包括
[
,而是搜索最小发生次数

这就是你的
a

但是当你在做

/^([^[]+?)(\[.*\])?$/.exec("abc[def]");
使用您的是:


secong组中的
*

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


此处提供了更多信息:

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


此处提供了更多信息:

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

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

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

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

+?
*?
这样的结构中的
会导致它前面的操作符以非贪婪或懒惰的方式行为。这意味着它将消耗尽可能少的字符,而不是尽可能多的字符le(默认值)

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

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

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

@SamIam这是incorrect@SamIam这是不正确的是,因此,如果路径是“abc[def]”,为什么我将“abc”作为匹配[1]而不仅仅是“a”?@user429400当我尝试使用此表达式时,您认为您将只匹配
a
+?)/这个路径:“abs[def]”它只匹配“a”(我正在用节点控制台测试它),很抱歉这么难,但是第二组只影响每对[]内部的匹配,不是吗?它不应该仅仅意味着:匹配“[”和“]”之间的所有内容吗?为什么它会影响第一个组的匹配,即匹配第一个“[”之前的字符?此外,当我在第一个组中尝试此表达式时,无论是否使用“?”,结果都是一样的。这就像它根本没有效果一样。是的,如果路径是“abc[def]”,为什么我会将“abc”作为匹配[1]而不仅仅是“a”?@user429400什么让你认为你只会匹配
a
?当我用这个表达式尝试时:/^([^[]+?)/和这个路径:“abs[def]”它只匹配“a”(我正在用节点控制台测试它),很抱歉这么难,但是第二个组只会影响每对[],不是吗?它不应该仅仅意味着:匹配“[”和“]”之间的所有内容吗?为什么它会影响第一个组的匹配,第一个组匹配第一个“[”之前的字符?此外,当我尝试使用带“?”和不带“?”的表达式时在第一组中,结果保持不变。看起来它根本没有任何效果。是的,但是,第二个表达式似乎以某种方式改变了这种行为……第二个表达式
(\[.\])?
匹配任何类似“[这里的东西]”的内容在字符串的末尾。此处的
允许此内容出现max一次。好的,我理解第二个表达式。它确实匹配第一个“[”和最后一个“]”之间的所有内容。我不理解第一个表达式中“?”的含义。我想它应该是指:匹配0或1个不是“[”的字符.结果它没有改变任何东西,似乎没有任何效果。是的,但再次,它似乎是第二个exp