Странное поведение метода String содержит и replaceAll специальными символами - PullRequest
1 голос
/ 23 марта 2012

Я провел небольшое исследование с использованием метода 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

Мне интересно, что за теория / правило стоит за этим?

Ответы [ 2 ]

3 голосов
/ 23 марта 2012

Аргумент contains и первый аргумент replaceAll интерпретируются по-разному: первый - просто последовательность символов, а последний - регулярное выражение . Поскольку * является метасимволом языка регулярных выражений Java, который не может отображаться без экранирования сам по себе (он должен следовать за выражением, повторяющимся в совпадении ноль или более раз), он обрабатывается по-другому два метода.

0 голосов
/ 23 марта 2012

str.replaceAll (...) использует регулярное выражение в качестве первого аргумента.Символы *, $, ^, +,?и другие являются частью синтаксиса регулярного выражения .См. ссылка для получения подробной информации о том, как они обрабатываются replaceAll.

...