Я провел небольшое исследование с использованием метода String для поиска содержимого и замены всех.
char c = '*';
String str = "1220"+c+""+c+""+c+""+c+""+c+"23";
System.out.println(str.contains(c+""));
System.out.println(str.contains("["+c+"]"));
System.out.println(str.contains("\\"+c));
System.out.println(str.replaceAll("["+c+"]", "X"));
System.out.println(str.replaceAll("\\"+c, "X"));
System.out.println(str.replaceAll(c+"", "X"));
Результаты: Когда c = '*' или '^' или '+'
true
false
false
1220XXXXX23
1220XXXXX23
java.util.regex.PatternSyntaxException
Когда c = '#' или '~' или '%' или '<' или '>' или '=' или '&' или '@' или '-' или '!'
true
false
false
1220XXXXX23
1220XXXXX23
1220XXXXX23
Когда c = '$'
true
false
false
1220XXXXX23
1220XXXXX23
1220$$$$$23X
, когда c = '|'
true
false
false
1220XXXXX23
1220XXXXX23
X1X2X2X0X|X|X|X|X|X2X3X
Мне интересно, что за теория / правило стоит за этим?