在与数字相邻的java正则表达式中使用反向引用

时间:2013-08-12 05:48:24

标签: java regex

我想使用regexp替换后引用 如果目标字符串类似于:

"$1 123"

每件事都很好。 但如果我想要一个目标字符串,如:

"$1123"

它不会工作。

在perl中,您可以使用

"${1}123"

要区分后面的引用和相邻的数字 - 是否有java等价物?

修改

如果有格式的时间戳

YYYYMMDDHHMMSS

像:

20130811123000

我希望重置小时,分钟和秒来获取

20130811000000

我想做的是

String newstring = timestamp.replaceFirst("(\\d{8}))\\d{6}","${1}000000");

3 个答案:

答案 0 :(得分:2)

您需要将替换指定为:

"$1\\123"

答案 1 :(得分:1)

$12如果存在,则引用第12组;如果反向引用少于12,则引用第1组。

所以,在$1123 $1中,如果只捕获了一个群组,$11如果捕获了超过11个群组,那么

reference

答案 2 :(得分:1)

这似乎逃脱了。

查看此案例:

String input = "abcd";
System.out.println(input.replaceAll("(a)bcd(e)*?(e)*?(e)*?(e)*?(e)*?(e)*?(e)*?(e)*?(e)*?(e)*?(e)*?", "$1123"));
System.out.println(input.replaceAll("(a)bcd(e)*?(e)*?(e)*?(e)*?(e)*?(e)*?(e)*?(e)*?(e)*?(e)*?(e)*?", "$1\\123"));

输出:

23
a123

在这种情况下,我在反向引用的组1和反向引用的组11之间存在歧义。 在第一次打印中,我没有逃避反向引用,因此第11组很可能被解释,并且它是空的。 在第二次印刷中,我在反向引用第1组后逃避替换。