Java正则表达式中的反向引用是Java提供的另一个重要功能。 要了解反向引用 ,我们首先需要了解群组 。 正则表达式中的分组意味着将多个字符视为一个单元。 通过将要分组的字符放在一组括号“()”中来创建它们。 每组括号对应一个组 。
反向引用很方便,因为它允许我们重复模式而无需再次编写。 我们可以使用\#来引用先前定义的组(#是组号)。 阅读以下两个示例后,这将更有意义。
示例1:查找重复图案
(\ d \ d \ d)\ 1匹配123123,但不连续匹配123456。 这表明所引用的模式必须确切地是名称。
String str = "123456";
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 0 6
示例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("Matching subsequence is \"" + val + "\"");
System.out.println("Duplicate word: " + m.group(1) + "\n");
}
Matching subsequence is “unique is not duplicate but unique”
Duplicate word: unique
Matching subsequence is “Duplicate is duplicate”
Duplicate word: Duplicate
注意:这不是使用正则表达式查找重复单词的好方法。 从上面的示例中,第一个“重复项”不匹配。
为什么要使用反向引用?
- 查看更多正则表达式示例 。
翻译自: https://www.javacodegeeks.com/2013/09/backreferences-in-java-regular-expressions.html