无括号的JavaScript交替

无括号的JavaScript交替,javascript,regex,Javascript,Regex,我在JavaScript中有一个字符串,如下所示: "This {{@is}} a $|test$| string with $|@string$| delimiters {{as}} follows" 我有一个正则表达式,用于提取$|.*.$|和{.*.}之间的字符串,如下所示: /{{(.*?)}}|\$\|(.*?)\$\|/g 例如: 我希望合并备选方案,以便只有一个匹配组,例如: /{{|\$\|(.*?)}}|\$\|/g 但是这似乎忽略了我的量词0或1次(代码?),并且它匹配

我在JavaScript中有一个字符串,如下所示:

"This {{@is}} a $|test$| string with $|@string$| delimiters {{as}} follows"
我有一个正则表达式,用于提取
$|.*.$|
{.*.}
之间的字符串,如下所示:

/{{(.*?)}}|\$\|(.*?)\$\|/g
例如:

我希望合并备选方案,以便只有一个匹配组,例如:

/{{|\$\|(.*?)}}|\$\|/g
但是这似乎忽略了我的量词0或1次(代码?),并且它匹配整个字符串,直到
。。。{{as

例如:

为什么会这样

如果我将该正则表达式增强为包含括号,如下所示,它确实有效:

/({{|\$\|)(.*?)(}}|\$\|)/g
例如:

但这包括了匹配组中的花括号/美元管道,这正是我试图避免的(因为我只关心这些分隔符之间的字符串,所以只需要一个匹配组)

有人能解释一下吗

(?:{{|\$\|)(.*?)(?:}}|\$\|)

 ^^              ^^  
您可以试试这个。请参阅演示。通过使其他组
不捕获
,您将只有一个组

但这也将匹配
{asd$|

您的正则表达式
{{{{124;\$\\\\\\\(.*?}}}\$\\\\\\\\\\
将匹配以下任何不同字符串:

{{

\$\\124;(.*?}}
\35;看看这个字符串的开头和结尾,你就会明白了

$|

这就是您获得匹配的原因,让我们比较一下:

工作正则表达式:

/({{|\$\|)(.*?)(}}|\$\|)/g
/{{|\$\|(.*?)}}|\$\|/g
和不工作的正则表达式:

/({{|\$\|)(.*?)(}}|\$\|)/g
/{{|\$\|(.*?)}}|\$\|/g
在第二个正则表达式中,
(.*)
后面必须紧跟着
}
,并且交替是针对整个
\$\\\\\;(.*)}
子模式的,因此有效地意味着匹配:

而在第一个正则表达式中,由于分组交替,在
(.*)
之前和之后正确应用了

您也可以使用非捕获组:

/(?:{{|\$\|)(.*?)(?:}}|\$\|)/g
现在它的意思是:

{{
\$\\\\\
后接
(.*?
后接
}
\$\\\\\\