我的标题可能无法完全解释我的意思。输入以下字符串:
POWERSTART9^{{2|3}}POWERENDx{{3^EXSTARTxEXEND}}=POWERSTART27^{{1|4}}POWEREND
我在这里想要做的就是隔离像这样的部分:
{{2|3}} or {{1|4}}
以下表达式在一定程度上有效,它选择了第一个{{2 | 3}}没问题:
\{\{(.*?)\|(.*?)\}\}
问题在于,这不只是选择{{2 | 3}}和{{1 | 4}}的第二个字符,因为在第一个字符之后我们有{{3 ^ EXSTARTxEXEND}},所以它需要从{{3开始,一直到第二部分我要的结尾| 4}}
此处在RegExr上突出显示:
我从未对regex感到满意,也无法解决如何阻止它。有任何想法吗?我基本上希望它只匹配确切的模式,而不是包含它的东西。
答案 0 :(得分:1)
您可以使用
7.1.4
请参见regex demo。
如果\{\{((?:(?!{{).)*?)\|(.*?)}}
子字符串中没有{
和}
,则可以使用更简单的{{...}}
表达式(请参见demo)。
详细信息
\{\{([^{}|]*)\|([^{}]*)}}
-一个\{\{
子字符串{{
-捕获组1:不会启动((?:(?!{{).)*?)
字符序列({{的任何字符(.
),应尽可能少(*?
) 3}})
{{
-除[^{}|]*
,{
和}
之外的0个或多个字符|
-一个\|
字符|
-捕获组2:0个或多个字符,尽可能少
(.*?)
-除[^{}]*
和{
之外的0个或多个字符}
-一个}}
子字符串。答案 1 :(得分:0)
尝试一下\{\{([^\^|]*)\|([^\^|]*)\}\}