Экранирование длинной последовательности метасимволов в методе Java .replaceAll

Я уже некоторое время пытаюсь решить эту проблему, я использую .replaceAll для удаления любого символа в строке, который не является буквой или цифрой. Я пытался использовать Pattern.quote(), но мне не удалось заставить его работать правильно. Затем я попытался использовать \Q и \E, но это все еще не работает, даже с моими неудачными попытками ввести разное количество обратных косых черт. Это мой первый раз, когда я пытаюсь сбежать таким образом, поэтому любая помощь будет очень признательна.

Вот строка, о которой идет речь:

return input.toLowerCase().replaceAll("\\Q !"#$%&'()*+,-./:;<=>?@[]\^_`~{}|\\E","");

person Phillip Murphy    schedule 05.03.2018    source источник


Ответы (2)


Одним из простых исправлений здесь было бы просто поместить все специальные символы в класс символов:

String input = "abc%#$123";
input = input.toLowerCase().replaceAll("[!\"#$%&'()*+,\\-./:;<=>?@\\[\\]\\\\^_`~{}|]","");
System.out.println(input);

abc123

Класс символов допускает большинство ваших специальных символов как неэкранированные литералы. Исключения составляют двойные кавычки, обратная косая черта и открывающие/закрывающие квадратные скобки, которые, тем не менее, требуют экранирования.

Демо

Примечание. Может быть гораздо проще просто удалить все, что не является буквенно-цифровым, например.

input = input.replaceAll("[^A-Za-z0-9]", "");

Но, возможно, есть персонажи, которых вышеперечисленное исключило бы, но вы действительно хотите сохранить.

person Tim Biegeleisen    schedule 05.03.2018
comment
,-. нужно сбежать. - person Pshemo; 05.03.2018
comment
@Pshemo Нет, за исключением тире, которое, как вы указали, следует переместить в самый конец класса символов. - person Tim Biegeleisen; 05.03.2018
comment
@TimBiegeleisen: Чтобы быть придирчивым, самое начало тоже сработает. - person Jan; 05.03.2018
comment
OK, на самом деле ,-. указывает диапазон, который соответствует только , - и ., так что это сработает (к счастью). Но все же, чтобы упростить работу с регулярным выражением, мы должны экранировать -, когда мы подразумеваем, что он является литералом, а не индикатором диапазона. - person Pshemo; 05.03.2018
comment
@Pshemo Хороший звонок ... никогда не думал о том, чтобы избежать тире таким образом. Большинство вещей, которые вы найдете на SO, предлагают просто переместить их в конец. - person Tim Biegeleisen; 05.03.2018
comment
Ставить - в конце (или начале) без экранирования кажется опасным: кто-то может прийти и добавить больше символов после (или до). Сохранение двух обратных косых черт похоже на ложную экономию. - person Andy Turner; 05.03.2018

return input.toLowerCase().replaceAll("[^A-Za-z0-9()\[\]]", "");

Источник: Как удалить недопустимые символы из строка?

person Sabesh    schedule 05.03.2018
comment
Руки прочь от моих ???? и ????. Это удаляет гораздо больше, чем код OP - person Andy Turner; 05.03.2018
comment
@AndyTurner Ого! Откуда взялись эти значки? И разве газировка не подходит к пицце, а не к пиву? - person Tim Biegeleisen; 05.03.2018
comment
@TimBiegeleisen, это просто обычные смайлики Юникода: ????, ????. - person Andy Turner; 05.03.2018