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 :-("); } } }