2

私はこの形式の文字列のセットを持っています:

NOOO (2), { AAA (1), BBB (2), CCC-CC (3), DDD (4) }

(括弧内の要素は 4 つ以上にすることができます)

角かっこ内の内容を一致させ、(グループを使用して) 'AAA'、'BBB'、... 部分文字列のみを抽出する必要があります。したがって、この例の結果は次のようになります

group1 : AAA
group2 : BBB
group3 : CCC-CC
group4 : DDD

私はこの式で試しました:

\{ (?:(\S+) \(\d+\),?\s?)+ \}

ただし、最後に一致したグループのみが返されます (したがって、この場合は「DDD」のみ)。私は何が欠けていますか?ありがとう

4

1 に答える 1

3

.NET 正規表現を使用している場合、キャプチャ グループがすべての値をキャプチャするため、式は機能します。それ以外の場合は、よりトリッキーな正規表現を使用するか、これを 2 つのステップで照合する必要があります。最初に{ ... }グループを照合し、次にその中の要素を照合します。

トリッキーな正規表現は次のようになります。

(?:{|\G(?!^),)   # match a { or where the previous match ended followed by a ,
\s+              # space between elements
(\S+)\s+\(\d+\)  # an element
(?=[^{]*})       # make sure it's eventually followed by a }

/xフラグを使用すると、その式をそのまま使用できます((?x)式の先頭に追加して設定することもできます)。

コメントなしの正規表現:

(?:{|\G(?!^),)\s+(\S+)\s+\(\d+\)(?=[^{]*})

この式は\G、正規表現フレーバーがサポートする必要があるものを使用します。Perl、PCRE (PHP/etc)、.NET など、ほとんどの最新の正規表現フレーバーにはそれがあります。

このような表現は完全ではないことに注意してください。たとえば、次の文字列でAAAandをキャプチャします。BBB

{ AAA (1), BBB (23), CCC, something invalid here #¤% ))),,,,!! }

必要に応じて修正できます(カウンターを除く)。

于 2012-06-05T12:58:08.670 に答える