2012-04-19 8 views
1

私は特定のJava正規表現がマッチするものを理解することに苦労しています:Javaでキャプチャグループと逆参照を持つこの正規表現はどのように一致しますか?

"<(\\w+)></\\1>" 

私はこのhttp://docs.oracle.com/javase/tutorial/essential/regex/

を読んできた。しかし、私はまだその式はに一致するだろうかを把握することはできません、特に\1部分。私は<(\w+)>が任意の単語にマッチする所有量限定子であることがわかりますが、私はチュートリアルにしたがってグループを一致させるための理由である()を使用する理由を理解していません。

2番目の部分については、私はちょうど\1が一致するか分からない。私は多分それは数と一致しますが、置き換え何もないとして、それは私の文字列を私に返したと思ったので、私は

"001123344556678899".replaceAll("\\1", ""); 

でそれを試してみました。

+1

<(\w+)></\1>はこの<body></body>のように入力してJava文字列"<(\\w+)></\\1>"なりますそのチュートリアルの「グループの取得」セクション(http://docs.oracle.com/javase/tutorial/essential/regex/groups.html)を参照してください。 – trutheality

+0

私はそれを逃したとは信じられない、それは実際に説明されている1、説明している、非常にありがとう – snajahi

答えて

8

XML/HTMLタグのペアを一致させるためのものだ、など

<tag></tag> 

として \\1は、最初にマッチしたグループに一致し、括弧内すなわち事を意味します。 (ダブルバックスラッシュは、Java文字列リテラルでバックスラッシュをエスケープする必要があるためです)

+0

助けを感謝するサイモン、ありがとう – snajahi

1

私はこのチュートリアルを誤解していると思います。 ()の中にあるものはすべてセットなので、(\w{1})(\w{1})は、それぞれに1文字ずつ2セットあることを意味します。 \1、最初のセットを参照してください。だから、より多くのあなたでは、この検索と置換のようなものです:

"1234234234234".replaceAll("(23)", "\\1ab") 

と結果はあなたが何をあなたが最初のセットに一致"123ab423ab423ab..."\1リターンとなります。

+0

助けてくれてありがとう、 "1234234234234" .replaceAll( "(23) \ 1ab ")は、replaceAllの2番目のパラメータがRegexとして評価されていないので機能しません – snajahi

+0

@ K-SaMaはそれについて考えませんでした。しかし、あなたが正しいです、置換文字列は正規表現として扱われません。 – Churk

+0

置換文字列では '$ 1'を使って' \ 1'ではなく最初のグループを参照します。そして、* sets *ではなく* groups *と呼ばれます。また、 '{1}'は正規表現に混乱を加え、n00bを混乱させるだけです。それを使用しないでください。 –

1

regexのバックリファレンス(およびグループのキャプチャ)についての理解を深めてください。 here。キャプチャグループは()を使用し、後方参照は参照グループによってキャプチャされたデータに置き換えられます。

次に、あなたの表現と、このようなあなたのデータをテストするためにthis siteを使用します。

正規表現:[「後方参照」の項を参照してください

Test Target String matches() replaceFirst() replaceAll() group(0) group(1) 

1  <body></body> Yes   Yes    Yes    <body></body> body 
+1

regexplanetのウェブサイトに感謝します! – snajahi

関連する問題