2017-04-11 29 views

回答

4

您需要与lookarounds限制分隔符:

(?<!{){{{(?!{)(.*?)(?<!})}}}(?!}) 
^^^^^^ ^^^^  ^^^^^ ^^^^^ 

regex demo

(?<!{)是负回顾后失败的比赛,如果有一个{立即到当前位置的左边并且(?!{)是负面的前瞻,它将立即将比赛失败到当前位置的右侧。使用类似的结构来设置}}}尾随分隔符的上下文。

以排除匹配包含要么{},则需要更换.*?(懒点匹配模式){{{....}}}子带*否定字符类[^{}]*也会使(?!{)(?<!{) 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(); 
+0

请注意它也会匹配类似'{{{t {est}}}'的东西。 @ stej4n的答案没有这个缺陷。 – vyrp

+0

这只是一个说明。我不知道OP真正需要什么。 – vyrp

+0

我加了一些,然后。这只是对整体环视限制概念的额外调整。 –

1

您可以使用这一个

[^{}]*任何字符除了 {或}

}{3}结束} 3倍恰好

由负回顾后(?<!{)和负先行(?!})环绕,以确保在紧接前一字符将不是{和那下一个直接的字符将不会是}

相关问题