具有捕获组和反向引用的正则表达式如何在Java中匹配?

时间:2012-04-19 15:16:04

标签: java regex

我很难理解某个Java正则表达式会匹配什么:

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

我已阅读此http://docs.oracle.com/javase/tutorial/essential/regex/

但我仍然无法弄清楚该表达式会匹配什么,尤其是\1部分。我可以看到<(\w+)>是一个与任何单词匹配的占有量词,但我不明白为什么使用根据本教程的()来匹配一个组。

至于第二部分,我只是不知道\1会匹配什么。我用

试了一下
"001123344556678899".replaceAll("\\1", ""); 

因为我认为它可能与一个数字相匹配,但它让我回到我的字符串,因为没有任何替代。

3 个答案:

答案 0 :(得分:8)

它旨在匹配XML / HTML标记对,例如

<tag></tag>

\\1表示匹配第一个匹配的组,即括号中的内容。 (双反斜杠是因为反斜杠需要在Java字符串文字中进行转义。)

答案 1 :(得分:1)

我想你可能误解了这个教程。 ()内的任何内容都是一个集合,因此(\w{1})(\w{1})意味着您有2个集合,每个集合中包含1个字符。 \1,引用第一组。所以在搜索和替换中更像是这样:

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

,结果为"123ab423ab423ab..."\1会返回您在第一集中匹配的内容。

答案 2 :(得分: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