символы замены, которые не соответствуют тем в regex

У меня есть этот regex:

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

Я проверяю, соответствует ли моя строка этому regex, и В ПРОТИВНОМ СЛУЧАЕ я хочу заменить все символы, которые не являются здесь, с "_".

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

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-м regex "~", кажется, не опускает следующие символы.

Какая-либо идея?

5
задан Péter Török 9 April 2010 в 11:12
поделиться

2 ответа

У вас несколько проблем в вашем regex (см. правила в Pattern class):

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

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

8
ответ дан 18 December 2019 в 14:44
поделиться

Попробуйте:

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] , чтобы указать дефис, за которым следует строчная буква. Примечание: вам не нужно экранировать первый дефис.

5
ответ дан 18 December 2019 в 14:44
поделиться
Другие вопросы по тегам:

Похожие вопросы: