1

次のコードがあるとします。

var myList = new List<string> { "red shirt", "blue", "green", "red" };
Regex r = new Regex("\\b(" + string.Join("|", myList.ToArray()) + ")\\b");
MatchCollection m = r.Matches("Alfred has a red shirt and blue tie");

これらはすべて文字列mに含まれているため、 の結果を含めたいのですが、取得しているのは. オーバーラップを含めるにはどうすればよいですか?"red shirt", "blue", "red""red shirt", "blue"

4

1 に答える 1

1

最初の有効な一致が見つかるとすぐに、正規表現パーサーが一致文字列を削除しているように思えます。現在、Windows コンパイラをセットアップしていないため、リンゴとリンゴを比較することはできませんが、perl でも同様の結果が得られます。

参加すると、正規表現は次のようになると思います。

'\b(赤いシャツ|青|緑|赤)\b'

この正規表現をテストすると、「赤いシャツ」、「青」と同じ結果が表示されます。「赤いシャツ」を正規表現リストの最後に移動します。

'\b(赤|青|緑|赤いシャツ)\b'

「赤」「青」が見えるようになりました。

正規表現をもう少し複雑なアプローチに変更することで、必要な結果を得ることができる場合があります。

\b(青|緑|(赤)シャツ)\b

これは、赤を独自のサブグループとして、赤シャツをグループとしても一致させる必要があります。

「赤いシャツ」、「赤」、「青」を返します

赤と赤のシャツのように複数の一致が必要な単語グループが多数ある場合は、文字列のリストをループして一度に 1 つずつ一致させるのがより簡単な方法です。

正規表現を行うには非常に多くの方法があるため、おそらく明白でエレガントな解決策を見逃しています。

于 2010-10-22T15:30:29.993 に答える