Как отфильтровать строку для нежелательных символов с помощью регулярных выражений? - PullRequest
27 голосов
/ 09 февраля 2011

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

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"

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

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

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

Еще одно дополнение: - Это не только для пробелов, но и для любого персонажа.

Ответы [ 6 ]

48 голосов
/ 09 февраля 2011

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

dirtyString.replaceAll("[^a-zA-Z0-9]","")
13 голосов
/ 10 февраля 2011

Если вы используете 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.

9 голосов
/ 09 февраля 2011

Использование replaceAll.

6 голосов
/ 09 февраля 2011

Это сделает это:

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

и работает, заменяя все пробелы на «ничто».

5 голосов
/ 09 февраля 2011
String resultString = subjectString.replaceAll("\\P{L}+", "");

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

0 голосов
/ 08 мая 2018

Я также предпочитаю подход белого списка. Вы никогда не будете знать, что происходит. Кажется, в кодировке больше символов, чем символов. Таким образом, вы можете контролировать все это:

public String convert(String s) {
  s = StringUtils.removePattern(s, "[^A-Za-zäöüÄÖÜß?!$,. 0-9\\-\\+\\*\\?=&%\\$§\"\\!\\^#:;,_²³°\\[\\]\\{\\}<>\\|~]'`'");
  return s.trim();
}

Это содержит все немецкие умлауты и французские акценты и ... вы знаете - просто посмотрите на свою клавиатуру. Я думаю, что выбрал их всех. Не стесняйтесь опускать специальные символы, такие как <>, чтобы предотвратить внедрение кода ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...