Java中的正则表达式反向引用

我不得不匹配一个数字,然后自己14次。 然后我来到regexstor.net/tester中的以下正则表达式:

(\d)\1{14} 

编辑

当我将其粘贴到我的代码中时,包括正确的反斜杠:

 "(\\d)\\1{14}" 

我用"$1"替换了后引用"\1" ,用于替换Java中的匹配。

然后我意识到它不起作用。 当您需要在REGEX中反向引用匹配时,在Java中,您必须使用"\N" ,但是当您想要替换它时,运算符是"$N"

我的问题是:为什么?

$1不是Java正则表达式中的后向引用,也不是我能想到的任何其他类型。 当你更换东西时,你只使用$1

 String input="A12.3 bla bla my input"; input = StringUtils.replacePattern( input, "^([AZ]\\d{2}\\.\\d).*$", "$1"); // ^^^^ 

关于后引用的内容有一些错误的信息,包括我从那里得到的代码片段: 带有反向引用的简单java正则表达式不起作用 。


Java在其他现有的版本之后建模其正则表达式语法,其中$已经是元字符。 它锚定到字符串的末尾(或多行模式中的行)。

类似地,Java使用\1作为反向引用。 因为正则表达式是字符串,所以必须对其进行转义: \\1

从词汇/句法的角度来看,确实可以毫不含糊地使用$1 (作为奖励,它可以防止在使用反向引用时需要“邪恶的逃脱”)。

要匹配行结束后的1 ,正则表达式需要为$\n1

 this line 1 

使用熟悉的语法而不是更改规则更有意义,其中大多数来自Perl。

Perl的第一个版本于1987年问世,比Java早得多,后者于[1995]发布。

我挖出了Perl 1的手册页 ,其中说:

也可以使用包围构造(\ ...\ ) ,在这种情况下, \匹配digit的子串。 (在模式之外,总是在数字前面使用$而不是\$ (以及$\`$&$' )的范围延伸到封闭BLOCK或eval字符串的末尾,或者下一个模式与子表达式的匹配。 \符号有时在当前模式之外工作,但不应该依赖。)你可以拥有任意数量的圆括号。 如果你有超过9个子串,变量$10$11 ,…引用相应的子串。 在模式中, \10\11等等,如果在反向引用之前至少存在许多左边的parens,则返回子串。 否则(对于向后兼容性) \10\010 ,退格相同, \11\011相同,是一个选项卡。 等等。 ( \1\9总是反向引用。)

我认为主要的问题不是反向引用 – 它在java中与\1完美配合。

您的问题更可能是Java中正则表达式的“整体”转义。

如果你想拥有这种模式

 (\d)\1{14} 

传递给正则表达式引擎,你首先需要转义它,因为当你编写它时它是一个java字符串:

 (\\d)\\1{14} 

瞧,像魅力一样:goo.gl/BNCx7B(添加http://,SO不允许Url-Shorteners,但是tutorialspoint.com似乎没有其他选项)

离线实施例:

 import java.util.regex.Matcher; import java.util.regex.Pattern; public class HelloWorld{ public static void main(String []args){ String test = "555555555555555"; // 5 followed by 5 for 14 times. String pattern = "(\\d)\\1{14}"; Pattern r = Pattern.compile(pattern); Matcher m = r.matcher(test); if (m.find( )) { System.out.println("Matched!"); }else{ System.out.println("not matched :-("); } } }