2011-10-17 11 views
3

もう1つの正規表現に関する質問。テキストの一部をキャプチャしてその部分を他の場所にマッチさせる正規表現を作成するにはどうすればよいですか?例えばテキスト内の繰り返し部分を一致させる正規表現

私はそれは以下の文字列にマッチする式"(ab[cd]) bbb (ab[cd])"があるとします。

"abc bbb abc" 
"abc bbb abd" 
"abd bbb abc" 

など、私が何をしたいのか

は、テキスト「ABC」の最初のキャプチャの部分を取ることですテキストの終わりに繰り返していることを確認してください。

"abc bbb abc - Success" 
"abc bbb abd - Error" 
"abd bbb abc - Error" 
"abd bbb abd - Success" 

もちろんこの例は単純で、正規表現を使用せずにそれをチェックすることは可能ですが、実際の例はもっと複雑で、私はここで正規表現に固執したいと思います。

+0

これは、[backreferences](http://www.regular-expressions.info/brackets.html)が対象です。 –

+0

正式には、正規表現は有限状態機械と同じであり、FSMでこの問題を解決することはできません(メモリが必要なため)。したがって、正規表現のすべての実装でこの問題を解決する方法はありません。しかし、C#のRegexの実装では、非FSM拡張が使用される可能性があります。 – Oliver

答えて

1

逆参照を使用してください。例えば

^(abc).*?\1$ 

文字列の先頭に一致する部分がabcで始まり、何かが続く文字列と一致します。

1

バックリファレンスを使用できます。あなたの例の表現は

/(ab[cd]) bbb \1/ 
+0

申し訳ありませんが、タグを確認しませんでした。 '\ 1'がC#で動くかどうかはわかりません。そうでない場合は、代わりに '$ 1'を試してください –

関連する問題