Skip to content
Advertisement

how can I use backslash to backreference regex groups in java replaceAll()

for example:

String s = "1/14/2017".replaceAll("^(\d{1,2})/(\d{1,2})/", "$2/$1/");

this Java code will switch the place of ‘1’ and ’14’.

but The form that i want is below, unfortunately Java not supported this form

String s = "1/14/2017".replaceAll("^(\d{1,2})/(\d{1,2})/", "2/1/");

Is there any other tool can support this form?

Advertisement

Answer

You can’t do that. And although it is not processed as back references by the regex engine it is first a feature of the encoding of characters in a string.

If the engine supported it, you would need to encode it as \\2/\\1/ (or the real ugly \62\61) because is the String escape character and what follows is taken to be raw input. So System.out.println("101") would print the letter A.

But then the engine doesn’t support the aforementioned alternative encoding because then the replacement pattern is taken to be just a String of "2/1/" which isn’t what you want.

I would imagine the $ was chosen as it has no special meaning outside of a regular expression and is an easier way to encode a back reference indicator than escaping backslashes. But I have no evidence to support that reasoning.

User contributions licensed under: CC BY-SA
2 People found this is helpful
Advertisement