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