replacement 转义

在使用 replaceAll 方法时,遇到 replacement 中含有’$’和’'的情况会发生报错。

1
2
3
4
5
6
7
8
public class Main{
public static void main(String[] args){
String content = "Java8,Java11,Java17,Java21";
String regex = "Java";
System.out.println(content.replaceAll(regex, "$"));
System.out.println(content.replaceAll(regex, "\\"));
}
}

解决方法:

1
2
3
4
5
6
7
8
public class Main{
public static void main(String[] args){
String content = "Java8,Java11,Java17,Java21";
String regex = "Java";
System.out.println(content.replaceAll(regex, "\\$"));
System.out.println(content.replaceAll(regex, "\\\\"));
}
}

$8,$11,$17,$21
\8,\11,\17,\21

当不知道 replacement 中时候含有’$’和’'时,可以使用Matcher类中的quoteReplacement来解决问题

1
2
3
4
5
6
7
8
public class Main{
public static void main(String[] args){
String content = "Java8,Java11,Java17,Java21";
String regex = "Java";
System.out.println(content.replaceAll(regex, Matcher.quoteReplacement("$")));
System.out.println(content.replaceAll(regex, Matcher.quoteReplacement("\\")));
}
}

$8,$11,$17,$21
\8,\11,\17,\21

regex 转义

和 replacement 的情况类似,可以使用Pattern类中quote来解决问题

1
2
3
4
5
6
7
public class Main{
public static void main(String[] args){
String content = "$8,$11,$17,$21";
System.out.println(content.replaceAll(Pattern.quote("$"), "Java"));
System.out.println(content.replaceAll(Pattern.quote("$"), Matcher.quoteReplacement("\\")));
}
}

Java8,Java11,Java17,Java21
\8,\11,\17,\21