4

驚いたことに、正規表現を使用してテキストを解析する際によくある問題の答えや例を見つけることができませんでした。ネイティブのC#正規表現を使用しています。サードパーティのアセンブリではありません。

これはネストされたリストの問題です。たとえば、定義された形式のテキストファイルがありますが、それをクラスで構造化したいとします(以下の架空の例)。

Input Text
Name: Joe Smith
Occupation: Software Developer
Patent(s) Awarded: 3 award(s)
                   Light Bulb
                   Rollercoasters
                   NTFS

必要な出力は、次のような一致です。

MatchCollection.Groups["Name"].Value
MatchCollection.Groups["Occupation"].Value
MatchCollection.Groups["AwardCount"].Value

... and then some form of list for the individual patents...
e.g. MatchCollection.Groups["Award"][0].Value
e.g. MatchCollection.Groups["Award"][1].Value
e.g. MatchCollection.Groups["Award"][2].Value
          ... and so on ...

現在行われているのは、リスト以外のすべての情報を取得し、特許リストを単一の文字列として扱う最初のパスです。例えば:

Name:\s+(?<Name>.+)\nOccupation:\s+(?<Occupation>.+)\nPatent\(s\) Awarded:\s+(?<AwardCount>\d+).*\n(?<AwardInfo>(?:.*\r\n)*)

...次に、特許リストで2次パスを作成して、列挙可能な特許文字列のリストを作成します。この部分式項が発生するたびに取得されるようにすることを正規表現に伝えるために、以下の構成があれば便利です。

(?<AwardInfo>(?:.*\r\n)*)*
                         ^
                         Which would return a second list to the Match object.

個々の特許を反復処理する機能を提供する出力を取得するための簡単なものを見落としていますか?誰かがこの問題を1つの正規表現だけを使用して創造的に解決したことがない場合はどうでしょうか。

4

1 に答える 1

4

グループの外側に移動して(空白を削除し、改行をオプションにする)、<AwardInfo>各行に個別に一致するように正規表現を設定した場合:*

(?:\s*(?<AwardInfo>.*(?:\r\n)?))*

次に、そのグループのプロパティを使用しCapturesて、グループが一致したそれぞれの異なる値を取得できます。例えば、

MatchCollection[0].Groups["AwardInfo"].Captures[0] is "Light Bulb"
MatchCollection[0].Groups["AwardInfo"].Captures[1] is "Rollercoasters"
MatchCollection[0].Groups["AwardInfo"].Captures[2] is "NTFS"
于 2013-01-10T14:20:31.397 に答える