単語の境界の正規表現問題(オーバーラップ)
-
10-10-2019 - |
質問
次のコードが与えられます:
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を行う方法は非常に多いので、おそらく明白でエレガントなソリューションを見逃しているでしょう。
所属していません StackOverflow