我在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
但是这包括我的匹配组中的花括号/美元管道,这是我想要避免的(因为我只关心这些分隔符之间的字符串所以只需要一个匹配的组)。
有人可以对此有所了解吗?
答案 0 :(得分:2)
让我们进行比较:
工作正则表达式:
/({{|\$\|)(.*?)(}}|\$\|)/g
而不是正则表达式:
/{{|\$\|(.*?)}}|\$\|/g
在第二个正则表达式中(.*?)
必须跟}}
后面,并且替换为整个\$\|(.*?)}}
子模式,因此有效地表示匹配:
{{
或\$\|(.*?)}}
或\$\|
然而,由于分组交替导致的第一个正则表达式正确应用于&在(.*?)
之后。
您也可以使用非捕获组:
/(?:{{|\$\|)(.*?)(?:}}|\$\|)/g
现在意味着:
{{
或\$\|
后跟(.*?)
,然后是}}
或\$\|
。
答案 1 :(得分:1)
(?:{{|\$\|)(.*?)(?:}}|\$\|)
^^ ^^
你可以试试这个。看看演示。通过制作其他小组non capturing
,你只有1个小组。
https://regex101.com/r/cT0hV4/13
但这也会匹配{{asd$|
。
您的正则表达式{{|\$\|(.*?)}}|\$\|
将匹配以下不同字符串中的任何3
:
{{
\$\|(.*?)}}
#look在此字符串的开头和结尾处,您将理解
$|
。
这就是你获得那场比赛的原因,