2015-05-21 3 views
4

у меня есть регулярное выражение Java:Java - String.replaceAll заменить все символы, не в шаблоне

^[a-zA-Z_][a-zA-Z0-9_]{1,126}$ 

Это означает:

  • Начните с алфавитным символом или символа подчеркивания.
  • Последующие символы могут содержать буквы, цифры или символы подчеркивания.
  • Длина от 1 до 127 символов.

Теперь я хочу заменить строку с символами не в этом регулярном выражении с символом подчеркивания.

Пример:

final String label = "[email protected]#"; 
System.out.println(label.replaceAll("^[^a-zA-Z_][^a-zA-Z0-9_]{1,126}$", "_")); 

Но результат все равно [email protected]#.

Как я могу «преобразовать» его в _3_fgh99__?

+0

Поскольку «23_fgh99 @ #» начинается с '2', а не' [a-zA-Z_] ', совпадений нет. – Maroun

+0

Попробуйте 'label.replaceAll ("^[^ a-zA-Z_] | (?

+0

Упс, кажется, у меня есть ответ после редактирования :). –

ответ

3

Применение this code:

final String label = "[email protected]#"; 
System.out.println(label.replaceAll("^[^a-zA-Z_]|(?<!^)[^a-zA-Z0-9_]", "_")); 

Он выводит _3_fgh99__.

Чтобы удалить то, что «не находится в исходном шаблоне», вам необходимо свести на нет первый класс символов и только проверить символ в начале (^[^a-zA-Z_]), а затем проверить другие символы не в начале с помощью отрицаемого второго символа класс ((?<!^)[^a-zA-Z0-9_]). Затем мы просто используем символ чередования | для применения обоих шаблонов в 1 операции замены.

+0

Вы правы. Огромное спасибо. –

+0

Пожалуйста, попробуйте объяснить свой ответ для будущих пользователей. – Maroun

+0

@MarounMaroun: Конечно, я объясняю свои ответы в большинстве случаев, и этот случай кажется весьма своеобразным. –

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