首页 文章

RegEx解析嵌套标签?

提问于
浏览
0

我有这样的文字:

This is {name1:value1}{name2:{name3:even dipper {name4:valu4} dipper} some inner text} text

我想解析这样的数据:

Name: name1
Value: value1

Name: name2
Value: {name3:even dipper {name4:valu4} dipper} some inner text

然后我会递归处理每个值来解析嵌套字段 . 你能推荐一个RegEx表达式吗?

2 回答

  • 3

    在C#中,您可以使用balancing groups来计算和 balancer 括号:

    { (?'name' \w+ ) :       # start of tag
    (?'value'                # named capture
      (?>                    # don't backtrack
        (?:
          [^{}]+             # not brackets
        | (?'open' { )       # count opening bracket
        | (?'close-open' } ) # subtract closing bracket (matches only if open count > 0)
        )*
      )
      (?(open)(?!))          # make sure open is not > 0
    )
    }                        # end of tag
    

    示例:

    string re = @"(?x)       # enable eXtended mode (comments/spaces ignored)
    { (?'name' \w+ ) :       # start of tag
    (?'value'                # named capture
      (?>                    # don't backtrack
        (?:
          [^{}]+             # not brackets
        | (?'open' { )       # count opening bracket
        | (?'close-open' } ) # subtract closing bracket (matches only if open count > 0)
        )*
      )
      (?(open)(?!))          # make sure open is not > 0
    )
    }                        # end of tag
    ";
    
    string str = @"This is {name1:value1}{name2:{name3:even dipper {name4:valu4} dipper} some inner text} text";
    
    foreach (Match m in Regex.Matches(str, re))
    {
        Console.WriteLine("name: {0}, value: {1}", m.Groups["name"], m.Groups["value"]);
    }
    

    输出:

    name: name1, value: value1
    name: name2, value: {name3:even dipper {name4:valu4} dipper} some inner text
    
  • 2

    如果使用Perl / PHP / PCRE,它并不复杂 . 您可以使用如下表达式:

    {(\w+):         # start of tag
       ((?:
          [^{}]+    # not a tag
       |  (?R)      # a tag (recurse to match the whole regex)
       )*)
    }               # end of tag
    

相关问题