2012-04-19 49 views
1

我有很難理解什麼是一定Java正則表達式將匹配:這個捕獲組和反向引用的正則表達式在Java中如何匹配?

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

我已經通過這個http://docs.oracle.com/javase/tutorial/essential/regex/

讀,但我仍然無法弄清楚是什麼表情會匹配,尤其是\1部分。我可以看到<(\w+)>是一個與任何詞匹配的佔有量詞,但我不明白爲什麼使用根據本教程的()是爲了匹配一個組。

至於第二部分,我只是不知道\1會匹配什麼。我試過

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

因爲我以爲只是也許它匹配一個數字,但它給了我回我的字符串,因爲沒有被替換。

+1

參見[「後向引用」小節該教程中的「捕獲組」部分](http://docs.oracle.com/javase/tutorial/essential/regex/groups.html)。 – trutheality 2012-04-19 15:21:41

+0

我不能相信我錯過了,它實際上有\ 1解釋,非常感謝 – snajahi 2012-04-19 15:44:51

回答

8

它旨在匹配對XML/HTML標籤,如

<tag></tag> 

\\1裝置匹配於所述第一組匹配,即,在括號內的事情。 (雙反斜槓是因爲反斜槓需要在Java字符串文字中轉義。)

+0

謝謝西蒙,感謝幫助 – snajahi 2012-04-19 15:43:50

1

我想你可能誤解了本教程。 ()內的任何內容都是一個集合,因此(\w{1})(\w{1})意味着您有2個集合,每個集合有1個字符。 \1,引用第一組。因此,它更像是這你搜索並替換:

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

,其結果將是"123ab423ab423ab..."\1回報你,你在你的第一套匹配的內容。

+0

謝謝你的幫助,儘管「1234234234234」.replaceAll(「(23)」, \ 1ab「)將不起作用,因爲第二個參數replaceAll不作爲正則表達式求值 – snajahi 2012-04-19 15:49:56

+0

@ K-SaMa沒有考慮到這一點。但你是對的,替換字符串不被視爲正則表達式。 – Churk 2012-04-19 15:55:42

+0

在替換字符串中,您使用'$ 1'來引用第一個組,而不是'\ 1'。他們被稱爲*組*,而不是*組*。另外,'{1}'不會做任何事情,只會給正則表達式增加混亂並且混淆n00b;請不要使用它。 – 2012-04-19 17:39:52

1

只需刷新您對正則表達式反向引用(和捕獲組)的理解,例如here。捕獲組使用(),反向引用將被參考組捕獲的數據替代。

然後使用this site測試你的表達和你的數據是這樣的:

正則表達式:<(\w+)></\1>將成爲Java字符串"<(\\w+)></\\1>"與輸入這樣<body></body>

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

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

感謝regexplanet網站! – snajahi 2012-04-19 16:50:57

相關問題