2010-04-09 5 views
5

у меня есть это регулярное выражение:заменить символы, которые не соответствуют с теми, в регулярных выражениях

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

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

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

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

+0

Большое спасибо за четкое объяснение. –

4

Try:

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

+0

Я думаю, вам нужно сбежать '-' –

Смежные вопросы