String的奇怪行为包含并用特殊字符替换所有方法

时间:2012-03-23 12:31:08

标签: java string replaceall contain

我使用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

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

2 个答案:

答案 0 :(得分:3)

contains的参数和replaceAll的第一个参数被解释为:前者只是一个字符序列,而后者是regular expression 。由于*是Java正则表达式语言的元字符,它不能单独出现(它必须跟随表达式在匹配中重复零次或多次),因此它被视为这两种方法不同。

答案 1 :(得分:0)

str.replaceAll(...)使用正则表达式作为第一个参数。 人物*,$,^,+,?和其他人是正则表达式语法的一部分。有关replaceAll如何处理这些内容的详细信息,请参阅link