我对String的contains和replaceAll方法进行了一些研究。

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


我想知道这背后的理论/规则是什么?

最佳答案

contains的参数和replaceAll的第一个参数的解释不同:前者只是一个字符序列,而后者是一个regular expression。由于*是Java regexp语言的元字符,不能单独显示为转义字符(必须遵循一个表达式在匹配中重复零次或多次),因此这两种方法将其区别对待。

10-07 14:28