Подтвердить что ты не робот

Как фильтровать строку для нежелательных символов с помощью регулярного выражения?

В принципе, мне интересно, есть ли удобный класс или метод для фильтрации String для нежелательных символов. Результатом метода должен быть "очищенная" строка. То есть:

String dirtyString = "This contains spaces which are not allowed"

String result = cleaner.getCleanedString(dirtyString);

Ожидаемый результат:

"Thiscontainsspaceswhicharenotallowed"

Лучший пример:

String reallyDirty = " this*is#a*&very_dirty&String"

String result = cleaner.getCleanedString(dirtyString);

Я ожидаю, что результатом будет:

"thisisaverydirtyString"

Потому что я позволяю уборщику знать, что '', '*', '#', '&' и '_' - грязные символы. Я могу решить эту проблему, используя массив белых/черных списков символов. Но я не хочу изобретать колесо.

Мне было интересно, есть ли такая вещь, которая может "чистить" строки с помощью регулярного выражения. Вместо того, чтобы писать это сам.

Дополнение: Если вы считаете, что очистка струны может быть выполнена по-другому/лучше, я тоже все уши.

Другое дополнение: - Это не только для пространств, но и для любого характера.

4b9b3361

Ответ 1

Отредактировано на основе вашего обновления:

dirtyString.replaceAll("[^a-zA-Z0-9]","")

Ответ 2

Если вы используете guava в своем проекте (а если нет, полагаю, вы должны это учитывать), CharMatcher класс обрабатывает это очень красиво:

Ваш первый пример может быть:

result = CharMatcher.WHITESPACE.removeFrom(dirtyString);

в то время как вторая может быть:

result = CharMatcher.anyOf(" *#&").removeFrom(dirtyString);
// or alternatively
result = CharMatcher.noneOf(" *#&").retainFrom(dirtyString);

или если вы хотите быть более гибкими с пробелами (вкладки и т.д.), вы можете комбинировать их, а не писать свои собственные:

CharMatcher illegal = CharMatcher.WHITESPACE.or(CharMatcher.anyOf("*#&"));
result = illegal.removeFrom(dirtyString);

или вместо этого вы можете указать юридические символы, которые в зависимости от ваших требований могут быть:

CharMatcher legal = CharMatcher.JAVA_LETTER; // based on Unicode char class
CharMatcher legal = CharMatcher.ASCII.and(CharMatcher.JAVA_LETTER); // only letters which are also ASCII, as your examples
CharMatcher legal = CharMatcher.inRange('a', 'z'); // lowercase only
CharMatcher legal = CharMatcher.inRange('a', 'z').or(CharMatcher.inRange('A', 'Z')); // either case

а затем retainFrom(dirtyString), как указано выше.

Очень красивый, мощный API.

Ответ 4

Это будет сделано:

String dirtyString = "This contains spaces which are not allowed";
String result = dirtyString.replaceAll("\\s", "");

и работает, заменив все пробелы "ничего".

Ответ 5

String resultString = subjectString.replaceAll("\\P{L}+", "");

заменит любые небуквенные символы ничем.