Java 正则表达式中的反向引用是 Java 引擎支持的一项非常有用的功能。
为了理解什么是反向链接,您首先需要学会理解什么
是组。正则表达式中的组将多个字符视为一个单元。通过将字符放在括号中来创建组 - “()”。一对括号是一组。反向链接很方便,因为我们可以重复搜索模式而无需直接复制它们。
我们只需要使用类似\N 的结构来引用先前定义的组,其中
N是组号。下面两个例子让你感受一下反向链接的便利性。
示例 1:查找重复模式
(\d\d\d)\1 形式的构造与第 123123 行匹配,但与第 123456 行不匹配。String str = "ля123123ля"; Pattern p = Pattern.compile("(\\d\\d\\d)\\1"); Matcher m = p.matcher(str); System.out.println(m.groupCount()); while (m.find()) { String word = m.group(); System.out.println(word + " " + m.start() + " " + m.end()); }
输出:
1 123123 2 8
译者注! 在这里,作为一名译者,我想冒昧地插入一些我自己的评论,因为 我自己刚刚学习正则表达式,希望他们能用脏话纠正我:)如果我下面写的是错误:1)groupCount
()方法 返回模式中指定的组数,所以即使如果输入字符串是“la123”
456 la”,不适合模板,则屏幕上仍会显示数字1。 2)find
()方法 搜索下一组,但仅返回布尔值:true – 找到, false – 未找到 3)
group()方法 返回从模式中找到的最后一个子字符串。在本例中为 123123 4)
start()方法 返回源字符串中找到的子字符串的位置(当然,从零开始编号) 5) end
()方法 返回紧随找到的子字符串在源字符串中的位置子串。因此,该值并不指向源字符串中找到的子字符串的最后一个字符,而是指向它之后的下一个字符。
示例 2:查找重复单词
String pattern = "\\b(\\w+)\\b[\\w\\W]*\\b\\1\\b"; Pattern p = Pattern.compile(pattern, Pattern.CASE_INSENSITIVE); String phrase = "unique is not duplicate but unique, Duplicate is duplicate."; Matcher m = p.matcher(phrase); while (m.find()) { String val = m.group(); System.out.println("Найденная последовательность символов: \"" + val + "\""); System.out.println("Слово-дубликат: " + m.group(1) + "\n"); }
结论:
Найденная последовательность символов: "unique is not duplicate but unique" Слово-дубликат: unique Найденная последовательность символов: "Duplicate is duplicate" Слово-дубликат: Duplicate
请注意,这种查找重复单词(使用正则表达式)的方法并不是最佳的。例如,在上面的示例中,第一个单词“duplicate”被跳过。
GO TO FULL VERSION