【问题标题】:Strange behaviours of the String's contains and replaceAll methods with special characters带有特殊字符的字符串 contains 和 replaceAll 方法的奇怪行为
【发布时间】:2012-04-08 00:21:31
【问题描述】:

我对 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 = '#' or '~' or '%' or '' or '=' or '&' or '@' or '-' or '!'

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

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

【问题讨论】:

    标签: java string replaceall contain


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        猜你喜欢
        • 2011-01-16
        • 2023-03-20
        • 2019-08-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多