2011-03-22 9 views
0

こんにちは私は非常に特定の文字列構文に一致する正規表現パターンが欲しいです。以下は私がまとめたパターン文字列です。それは複雑な上あまりにもあり、それはいくつかのケースではなく、他に動作し、私はかなり確信している:特定の構文に一致する正規表現

 
\[\CONTENT\((?:(?:(?:(\w+) ?= ?((?:"(?:[^"]+)")|(?:'(?:[^']+)')|(?:(?:[^"',]+))) ?, ?)+(?:(?:\w+) ?= ?(?:(?:"(?:.+)")|(?:'(?:.+)')|(?:(?:[^"',]+)))))|(?:(?:\w+) ?= ?(?:(?:"(?:.+)")|(?:'(?:.+)')|(?:(?:[^"',]+)))))\)]

私が一致しようとしている文字列の構文は以下の通りです:

 
[CONTENT(Name="value, Name2='value2', Name_3 = value3, Name4= "value 4 \" includes an escaped quote")] etc 

返信したいマッチグループは以下の通りです

 
Match Group 1 - Match 1: [CONTENT(Name="value", Name2='value2', Name_3 = value3, Name4= "value 4 \" includes an escaped quote")] 

Match Group 2 - Match 1: Name="value" 
Match Group 2 - Match 2: Name 
Match Group 2 - Match 3: value 

Match Group 3 - Match 1: Name2='value' 
Match Group 3 - Match 2: Name2 
Match Group 3 - Match 3: value2 

Match Group 4- Match 1: Name_3 = value3 
Match Group 4- Match 2: Name_3 
Match Group 4- Match 3: value3 

Match Group 5 - Match 1: Name4= "value 4 \" includes an escaped quote" 
Match Group 5 - Match 2: Name4 
Match Group 5 - Match 3: value 4 \" includes an escaped quote 

私がマッチグループを参照するとき、私はマッチグループを参照しています。結果は上記と同じである必要はありませんが、可能な場合は類似している必要があります。

私はシンプルなRegexでうまくいくが、見回りなどで頭を上げることはできない。 "Name = Value"セットは、それぞれが '、'で区切られた数多く(おそらくは無制限の回数) '(コンマ) - 最後のセットを除いて(最後の名前/値セットの後には、'、 '(カンマ)は付きません)。 '='(等号)記号の両側と '、'(カンマ)の両脇にスペースを入れることができます。

これは正規表現または何を行うにはあまりにも複雑である場合、私は知らない(それがある場合、私は誰もがそのような文字列を解析する方法についての代替として与えることができます任意の提案に開いている。)

誰もが提供できるお手伝いをありがとう。

クリス

+0

例のデータの最初の属性と値のペアは、 'Name =" value、 '(値には閉じ引用符がありません)、最後の属性/値ペアにはエスケープされた引用符を含む適切に引用された値があります。不足している最初のものは、誤った引用符をタイプミスですか? – ridgerunner

+0

これは、多くの不要な非キャプチャグループです。 –

答えて

1

少なくとも一つます。attrib /値のペアが存在する必要があります...

  1. を仮定。 AND
  2. 各属性と値のペアは、1つのカンマとオプションの空白で区切られています。 AND
  3. 各属性値は、適切に引用された文字列または単一の「単語」です。 AND
  4. 引用符で囲まれた属性値文字列には、エスケープされた文字を含めることができます(例:v1="That's not \"MY\" problem!"および/またはv2='That\'s not "MY" problem!')。 AND
  5. 属性名または引用符で囲まれていない値 "word"は、英数字とダッシュのみで構成されます(つまり、[A-Za-z0-9_\-]+)。 (元の質問は明らかにこの要件を定義していないことに注意してください。)

次に(C#の場合)、この正規表現は正しく[CONTENT(a1=v1, a2=v2...)]構造と一致します:あなたが一致して撮影していたら

Regex regexObj = new Regex(
    @"# Match a [CONTENT(a1=v1, a2=v2...)] structure. 
    \[CONTENT\(\s*     # Opening delimiter 
    # Match required first attrib/value pair. 
    [\w\-]+       # First attrib name (Allow [A-Z-a-z0-9_-]. 
    \s*=\s*       # Name and value separated by =. 
    (?:        # Group value spec alternatives. 
     ""[^""\\]*(\\.[^""\\]*)*"" # Either double quoted string, 
    | '[^'\\]*(\\.[^'\\]*)*'  # or a single quoted string, 
    | [\w\-]+      # or single unquoted ""word"". 
    )        # End group for value alternatives. 
    # Match optional second, third... attrib/value pairs. 
    (?:        # Group to allow optional pairs. 
     \s*,\s*      # All pairs separated by comma. 
     [\w\-]+      # Attrib name. 
     \s*=\s*      # Name and value separated by =. 
     (?:       # Group value spec alternatives. 
     ""[^""\\]*(\\.[^""\\]*)*"" # Either double quoted string, 
     | '[^'\\]*(\\.[^'\\]*)*'  # or a single quoted string, 
     | [\w\-]+     # or single unquoted ""word"". 
    )        # End group for value alternatives. 
    )*        # Zero or more optional A=V pairs. 
    \s*\)\]       # Closing delimiter.", 
    RegexOptions.IgnoreCase | RegexOptions.IgnorePatternWhitespace); 

を単一の[CONTENT(...)]構造体では、一度に1つずつ、各atrib/valueのペアと一致する別の正規表現を使用して別のパターンを選択することができます。

このような非自明な正規表現を書くときは、は常にを使用し、コメントと字下げを追加してください!

+0

これは本当にありがとうございます。 – Neaox

0

これは確かに正規表現ではありません。適切なパーサーを代わりに使用してください。C#でコンバイナを解析することで再帰的な降下パーサーを実装するのは非常に簡単です。たとえば、thisまたはthisを参照してください。

関連する問題