我必须先匹配一个数字,然后再匹配14次。然后,我来到了regexstor.net/tester中的以下正则表达式:
(\d)\1{14}
编辑
当我将其粘贴到代码中时,包括正确的反斜杠:
"(\\d)\\1{14}"
我已经用来替换了反向引用"\1",该反向引用"$1"用于替换Java中的匹配项。
"\1"
"$1"
然后我意识到这是行不通的。在Java中,当需要在REGEX中向后引用匹配项时,必须使用"\N",但是要替换它时,运算符为"$N"。
"\N"
"$N"
我的问题是:为什么?
$1在Java的正则表达式中不是反向引用,也不是我能想到的任何其他形式。您仅$1在 替换 某些东西时使用:
$1
String input="A12.3 bla bla my input"; input = StringUtils.replacePattern( input, "^([A-Z]\\d{2}\\.\\d).*$", "$1"); // ^^^^
关于反向引用是什么存在一些误导信息,包括我从中获得该摘录的位置:带有反向引用的简单Java regex不起作用。
Java在其他$已经成为元字符的现有风格之后,对其正则表达式语法进行了建模。它锚定到字符串的末尾(或在多行模式下为行)。
$
同样,Java使用\1反向引用。由于正则表达式是字符串,因此必须转义:\\1。
\1
\\1
从词汇/句法的角度来看,确实$1可以明确地使用它(作为一项奖励,使用反向引用时,它可以防止“邪恶逃脱”的需要)。
为了匹配1行尾之后的,正则表达式必须为$\n1:
1
$\n1
this line 1
使用熟悉的语法而不是更改规则(大多数来自Perl)更有意义。
Perl的第一个版本于1987年问世,比Java早得多,后者于1995年以beta版本发布。
我挖了Perl 1的手册页,其中说:
(\ ...\ )也可以使用包围结构,在这种情况下,\<digit>匹配第digit‘个子字符串。(在模式之外,请始终使用$而不是\在数字前使用。$<digit>(和$\``,$&和$’)的范围扩展到封闭的BLOCK或eval字符串的末尾,或扩展到与子表达式匹配的下一个模式。该\符号有时在外部起作用当前的模式,但不应该依赖。)您可以根据需要添加任意多个括号。如果你有超过9子,变量$10,$11......请参阅相应的字符串。在模式中\10,\11,等等。如果在反向引用之前至少有很多左括号,请返回子字符串。否则(出于向后兼容性考虑)\10与\010,退格键和制表符\11相同\011。等等。(\1通过\9`总是反向引用。)
(\ ...\ )
\<digit>
digit
\
$<digit>
$\``,
和
)的范围扩展到封闭的BLOCK或eval字符串的末尾,或扩展到与子表达式匹配的下一个模式。该
符号有时在外部起作用当前的模式,但不应该依赖。)您可以根据需要添加任意多个括号。如果你有超过9子,变量
,
......请参阅相应的字符串。在模式中
,等等。如果在反向引用之前至少有很多左括号,请返回子字符串。否则(出于向后兼容性考虑)
与
,退格键和制表符
相同
。等等。(
通过