正则表达式{{匹配

时间:2011-05-14 14:57:45

标签: c# regex

我需要匹配以下整个声明:

{{CalendarCustom|year={{{year|{{#time:Y}}}}}|month=08|float=right}}

基本上只要有{,就需要有相应的},但原始代码中有许多嵌入式{ }。例如{{match}}{{ma{{tch}}}}{{m{{a{{t}}c}}h}}

我现在有这个:

(\{\{.+?(:?\}\}[^\{]+?\}\}))

这不太有用。

2 个答案:

答案 0 :(得分:15)

.NET正则表达式引擎允许递归匹配:

result = Regex.Match(subject,
    @"\{                   # opening {
        (?>                # now match...
           [^{}]+          # any characters except braces
        |                  # or
           \{  (?<DEPTH>)  # a {, increasing the depth counter
        |                  # or
           \}  (?<-DEPTH>) # a }, decreasing the depth counter
        )*                 # any number of times
        (?(DEPTH)(?!))     # until the depth counter is zero again
      \}                   # then match the closing }",
    RegexOptions.IgnorePatternWhitespace).Value;

答案 1 :(得分:4)

我建议为此编写一个简单的解析器/标记器。

基本上,您遍历所有字符并开始计算{}的实例 - 递增{并递减}。记录每个第一个{的索引和每个最后}的索引,您将获得嵌入式表达式的索引。

此时,您可以使用substring来获取这些内容并从原始字符串中删除/替换它们。

请参阅this问题和答案,了解RegEx不适合的原因。