可以举手this regex?正则表达式来查找包含在3个括号之间的字符串
\{{{(.*?)\}}}
它匹配
{{{test1}}}
{{{{test4}}}
{{{test5}}}
我想只匹配{{{test1}}}
和{{{test5}}}
。在左侧和右侧只能有3个括号,所以{{{{test4}}}
应该是无效的。
可以举手this regex?正则表达式来查找包含在3个括号之间的字符串
\{{{(.*?)\}}}
它匹配
{{{test1}}}
{{{{test4}}}
{{{test5}}}
我想只匹配{{{test1}}}
和{{{test5}}}
。在左侧和右侧只能有3个括号,所以{{{{test4}}}
应该是无效的。
您需要与lookarounds限制分隔符:
(?<!{){{{(?!{)(.*?)(?<!})}}}(?!})
^^^^^^ ^^^^ ^^^^^ ^^^^^
的(?<!{)
是负回顾后失败的比赛,如果有一个{
立即到当前位置的左边并且(?!{)
是负面的前瞻,它将立即将比赛失败到当前位置的右侧。使用类似的结构来设置}}}
尾随分隔符的上下文。
以排除匹配包含要么{
或}
,则需要更换.*?
(懒点匹配模式){{{....}}}
子带*否定字符类[^{}]*
也会使(?!{)
和(?<!{)
lookarounds冗余上述正则表达式:
(?<!{){{{([^{}]*)}}}(?!})
参见another regex demo,其中{{{test{6}here}}}
不匹配。
用法中提取值{{{
和}}}
之间:究竟(?<!{){{3}[^{}]*}{3}(?!})
说明
{{3}
开始于{ 3次:
var results = Regex.Matches(s, @"(?<!{){{{([^{}]*)}}}(?!})")
.Cast<Match>()
.Select(m => m.Groups[1].Value)
.ToList();
您可以使用这一个
[^{}]*
任何字符除了 {或}
}{3}
与结束} 3倍恰好
由负回顾后(?<!{)
和负先行(?!})
环绕,以确保在紧接前一字符将不是{和那下一个直接的字符将不会是}
请注意它也会匹配类似'{{{t {est}}}'的东西。 @ stej4n的答案没有这个缺陷。 – vyrp
这只是一个说明。我不知道OP真正需要什么。 – vyrp
我加了一些,然后。这只是对整体环视限制概念的额外调整。 –