7

コンマ区切りの単語リストに一致し、すべての単語をキャプチャする正規表現を作成しようとしています。この行は一致する必要があり、   apple , banana ,orange,peanut キャプチャは、、、、である必要があります。そのために、次の正規表現を使用します。applebananaorangepeanut

^\s*([a-z_]\w*)(?:\s*,\s*([a-z_]\w*))*\s*$

文字列との一致に成功しましたが、突然キャプチャされましたapplepeanutこの動作は、C# と Perl の両方で見られます。したがって、正規表現のマッチングがどのように機能するかについて何かが欠けていると思います。何か案は?:)

4

4 に答える 4

4

によって与えられる値は、2 番目のグループによってキャプチャされたmatch.Groups[2].Value最後の値です。

すべての値を見つけるmatch.Groups[2].Captures[i].Valueには、この場合は からまでiの範囲を調べます。(第1グループも同様です。)02match.Groups[1].Value

(質問の+1、今日何かを学びました!)

于 2012-11-19T08:41:23.100 に答える
3

これを試して:

string text = "   apple , banana ,orange,peanut";

var matches = Regex.Matches(text, @"\s*(?<word>\w+)\s*,?")
        .Cast<Match>()
        .Select(x => x.Groups["word"].Value)
        .ToList();
于 2012-11-19T08:47:10.093 に答える
2

キャプチャ グループを繰り返しています。一致が繰り返されるたびに、前のコンテンツが上書きされます。したがって、2 番目のキャプチャ グループの最後の一致のみが最後に利用可能になります。

2 番目のキャプチャ グループを次のように変更できます。

^\s*([a-z_]\w*)((?:\s*,\s*(?:[a-z_]\w*))*)\s*$

結果は、2 番目のグループの「、バナナ、オレンジ、ピーナッツ」になります。あなたがこれを望むかどうか、私にはわかりません。

文字列にそのパターンがあることを確認し、各単語を抽出する場合。私はそれを2つのステップで行います。

  1. 正規表現でパターンを確認してください。

  2. パターンが正しい場合は、先頭と末尾の空白を削除し、 で分割し\s*,\s*ます。

于 2012-11-19T08:39:53.897 に答える
2

簡単な正規表現:

(?:^| *)(.+?)(?:,|$)

説明:

?:    # Non capturing group
^| *  # Match start of line or multiple spaces
.+    # Capture the word in the list, lazy
?:    # Non capture group
,|$   # Match comma or end of line 

注: Rublularは、このようなことをテストするのに適した Web サイトです。

于 2012-11-19T08:49:56.150 に答える