質問

次のコードが与えられます:

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". 。オーバーラップを含めるにはどうすればよいですか?

役に立ちましたか?

解決

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

あなたの正規表現は参加した後、このようなものになると思います。

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

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

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

私は今、「赤」、「青」が見えます。

regexpをより複雑なアプローチに少し変更することにより、あなたが望む結果を達成できるかもしれません。

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

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

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

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

regexpを行う方法は非常に多いので、おそらく明白でエレガントなソリューションを見逃しているでしょう。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top