заменить символы, которые не совпадают с теми в регулярном выражении - PullRequest
5 голосов
/ 09 апреля 2010

У меня есть это регулярное выражение:

private static final String SPACE_PATH_REGEX ="[a-z|A-Z|0-9|\\/|\\-|\\_|\\+]+";

Я проверяю, соответствует ли моя строка этому регулярному выражению, и если НЕТ, я хочу заменить все символы, которых здесь нет, на "_".

Я пробовал как:

private static final String SPACE_PATH_REGEX_EXCLUDE =
        "[~a-z|A-Z|0-9|\\/|\\-|\\_|\\+]+";
if (myCompanyName.matches(SPACE_PATH_REGEX)) {
    myNewCompanySpaceName = myCompanyName;
} else{
    myNewCompanySpaceName = myCompanyName.replaceAll(
            SPACE_PATH_REGEX_EXCLUDE, "_");
}

но это не работает ..., поэтому во втором регулярном выражении "~", по-видимому, не пропускает следующие символы:

Есть идеи?

Ответы [ 2 ]

8 голосов
/ 09 апреля 2010

У вас есть несколько проблем в вашем регулярном выражении (см. Pattern класс для правил):

  • внутри класса символов | не имеет специального значения и должен быть удален без замены в вашем случае (если вы не хотите, чтобы ваш класс символов включал буквальный символ |).
  • Точно так же вам не нужно экранировать /, _ и + внутри класса персонажа.
  • - необходимо сбежать, только если это не последний символ
  • ~ также не имеет особого значения в классе символов, он просто представляет себя
  • вы захотите использовать ^ для отрицания содержимого группы символов.

Вы также можете пропустить первую проверку matches(), поскольку вызов replaceAll() вернет неизмененную строку, если в любом случае ничего не будет совпадать. Сохранение его (и второго регулярного выражения) служит только для введения в другое место, где могут скрываться ошибки (например, вы можете случайно обновить одно регулярное выражение, но не другое).

5 голосов
/ 09 апреля 2010

Попробуйте:

final String SPACE_PATH_REGEX_EXCLUDE = "[^\\w~/\\-+]";
String out = in.replaceAll(SPACE_PATH_REGEX_EXCLUDE, "_");

Основная проблема, с которой вы столкнулись, заключается в том, что вы добавляете ненужные | в ваш шаблон. У них другое значение. Кроме того, вы можете значительно упростить выражение, используя \w, что означает «символ слова», то есть буквы (верхний или нижний регистр), цифры или подчеркивание и является синонимом [A-Za-z0-9_].

Также вам необходимо понять, как работает экранирование. Есть экранирование Java-строки, поэтому вы вставляете \\, чтобы добавить одну обратную косую черту в шаблон. Но есть еще и регулярное выражение. Например, \n является символом новой строки Java String, а \\n является последовательностью для помещения \n в шаблон для поиска символа новой строки.

У вас есть две удобные опции для экранирования текста:

  1. Вы можете использовать \Q...\E. Все, что находится между \Q и \E, экранировано; и

  2. Вы можете использовать Pattern.quote() для указания произвольной строки.

Где вам нужно экранировать определенные последовательности в регулярных выражениях, контекстуально. Например, - необходимо экранировать, только если его можно принять за указание диапазона. [a-z] - символ нижнего регистра. [a\-z] является одним из a, - или z. Но вы можете сделать -[a-z], чтобы указать дефис, за которым следует строчная буква. Примечание: вам не нужно экранировать первый дефис.

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