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

次に、各値を再帰的に処理して、ネストされたフィールドを解析します。これを行うために正規表現を推奨できますか?

4

2 に答える 2

3

C# では、バランシング グループを使用して、ブラケットのカウントとバランスを取ることができます。

{ (?'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
于 2013-03-11T19:52:43.040 に答える
2

Perl / PHP / PCREを使用している場合、それはまったく複雑ではありません。次のような式を使用できます。

{(\w+):         # start of tag
   ((?:
      [^{}]+    # not a tag
   |  (?R)      # a tag (recurse to match the whole regex)
   )*)
}               # end of tag
于 2013-03-11T15:47:28.560 に答える