Принятый ответ:
String commonChars = s.replaceAll("[^"+t+"]","");
содержит ошибку !!!
Что если строка t
имеет метасимвол регулярного выражения?В этом случае replaceAll
терпит неудачу.
См. Эту программу в качестве примера, где строка t
содержит ]
в ней и ]
метасимвол регулярного выражения, обозначающий конец класса символов.Очевидно, что программа не выдает ожидаемый результат.
Почему?
Рассмотрим:
String s = "1479K";
String t = "459LP]";
Теперь регулярное выражение станет (просто подставим t
):
String commonChars = s.replaceAll("[^459LP]]","");
То есть заменить любой символ, кроме 4
, 5
, 9
, L
, P
, за которым следует ]
, ни с чем.Что явно не то, что вам нужно.
Чтобы исправить это, вам нужно выбрать ]
in t
.Вы можете сделать это вручную следующим образом:
String t = "459LP\\]";
и регулярное выражение прекрасно работает .
Это распространенная проблема при использовании регулярного выражения, поэтомукласс java.util.regex.Pattern
предоставляет статический метод с именем quote , который можно использовать для выполнения именно этого: заключать в кавычки регулярные выражения-метасимволы так, чтобы они обрабатывались буквально.
Таким образом, перед использованием t
в replaceAll
вы указываете его как:
t = Pattern.quote(t);
Программа, использующая метод кавычек , работает как ожидалось.