1

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

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

我已经阅读了这个http://docs.oracle.com/javase/tutorial/essential/regex/

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

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

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

因为我认为它可能匹配一个数字,但它给了我我的字符串,因为没有被替换。

4

3 回答 3

8

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

<tag></tag>

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

于 2012-04-19T15:19:47.533 回答
1

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

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

结果将是"123ab423ab423ab..."\1返回您在第一组中匹配的内容。

于 2012-04-19T15:22:28.117 回答
1

只需刷新您对正则表达式反向引用(和捕获组)的理解,例如这里。捕获组使用()和反向引用将被引用组捕获的数据替换。

然后使用这个网站来测试你的表达和你的数据,如下所示:

正则表达式:<(\w+)></\1>将成为"<(\\w+)></\\1>"具有如下输入的 Java 字符串<body></body>

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

1       <body></body>   Yes         Yes             Yes             <body></body> body
于 2012-04-19T16:02:53.260 回答