不带括号的JavaScript轮换

时间:2015-09-03 10:19:18

标签: javascript regex

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

"This {{@is}} a $|test$| string with $|@string$| delimiters {{as}} follows"

我有一个正则表达式,用于提取$|.*?$|{{.*?}}之间的字符串,如下所示:

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

示例:https://regex101.com/r/mV3uR1/1

我想结合交替,因此只有一个匹配组,例如:

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

但这似乎忽略了我的量词0或1次(?)并且它匹配整个字符串直至... {{as

示例:https://regex101.com/r/qZ7iI5/1

为什么会这样?

如果我增强该正则表达式以包括括号如下,它确实有效:

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

示例:https://regex101.com/r/fT5qH0/1

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

有人可以对此有所了解吗?

2 个答案:

答案 0 :(得分:2)

让我们进行比较:

工作正则表达式:

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

而不是正则表达式:

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

在第二个正则表达式中(.*?)必须跟}}后面,并且替换为整个\$\|(.*?)}}子模式,因此有效地表示匹配:

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

然而,由于分组交替导致的第一个正则表达式正确应用于&在(.*?)之后。

您也可以使用非捕获组:

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

现在意味着:

{{\$\|后跟(.*?),然后是}}\$\|

答案 1 :(得分:1)

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

 ^^              ^^  

你可以试试这个。看看演示。通过制作其他小组non capturing,你只有1个小组。

https://regex101.com/r/cT0hV4/13

但这也会匹配{{asd$|

您的正则表达式{{|\$\|(.*?)}}|\$\|将匹配以下不同字符串中的任何3

{{

\$\|(.*?)}} #look在此字符串的开头和结尾处,您将理解

$|

这就是你获得那场比赛的原因,