Отрицание регулярного выражения для замены строки - PullRequest
1 голос
/ 24 октября 2011

У меня есть следующий код, который может заменить адрес электронной почты в строке в Java:

addressStr.replaceFirst("([a-zA-Z0-9_\\-\\.]+)@((\\[[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.)|(([a-zA-Z0-9\\-]+\\.)+))([a-zA-Z]{2,4}|[0-9]{1,3})", "")

Итак, строка с John Smith <john@smith.com> станет John Smith <>. Как мне отрицать это, чтобы вместо этого он заменил все, что не соответствует адресу электронной почты, и получил конечный результат как просто john@smith.com?

Я пытался вставить ^ и ?<= спереди, но это не сработало.

Ответы [ 4 ]

6 голосов
/ 24 октября 2011

Ну, вам нужно изменить не регулярное выражение, а код вызова.Ваше регулярное выражение совпадает с адресом электронной почты (странным образом), и replace() удаляет его из строки.

Так что просто используйте

Pattern regex = Pattern.compile("([a-zA-Z0-9_\\-\\.]+)@((\\[[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.)|(([a-zA-Z0-9\\-]+\\.)+))([a-zA-Z]{2,4}|[0-9]{1,3})");
Matcher regexMatcher = regex.matcher(addressStr);
if (regexMatcher.find()) {
    address = regexMatcher.group();
}
3 голосов
/ 24 октября 2011

Полное Java-регулярное выражение для перехвата электронной почты будет выглядеть следующим образом:

"(?:[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*|\"(?:[\\x01-\\x08\\x0b\\x0c\\x0e-\\x1f\\x21\\x23-\\x5b\\x5d-\\x7f]|\\\\[\\x01-\\x09\\x0b\\x0c\\x0e-\\x7f])*\")@(?:(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?|\\[(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?|[a-z0-9-]*[a-z0-9]:(?:[\\x01-\\x08\\x0b\\x0c\\x0e-\\x1f\\x21-\\x5a\\x53-\\x7f]|\\\\[\\x01-\\x09\\x0b\\x0c\\x0e-\\x7f])+)\\])"

Для получения дополнительной информации об этом посмотрите http://tools.ietf.org/html/rfc2822#section-3.4.1.

Немногосложный, но он действителен для всех известных и действительных форматов писем (ваш не разрешает такие письма, как bob+bib@gmail.com, которые являются действительными).

Для вашей проблемы, как указано несколько раз, просто найдите (вороватьКусок кода Тима Пицкера):

Pattern regex = Pattern.compile("(?:[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*|\"(?:[\\x01-\\x08\\x0b\\x0c\\x0e-\\x1f\\x21\\x23-\\x5b\\x5d-\\x7f]|\\\\[\\x01-\\x09\\x0b\\x0c\\x0e-\\x7f])*\")@(?:(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?|\\[(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?|[a-z0-9-]*[a-z0-9]:(?:[\\x01-\\x08\\x0b\\x0c\\x0e-\\x1f\\x21-\\x5a\\x53-\\x7f]|\\\\[\\x01-\\x09\\x0b\\x0c\\x0e-\\x7f])+)\\])");
Matcher regexMatcher = regex.matcher(addressStr);
foundMatch = regexMatcher.find();
0 голосов
/ 24 октября 2011

Только не заменяйте .... используйте вместо этого совпадения.

0 голосов
/ 24 октября 2011

Вы можете попробовать:

String mailId = Pattern.compile(regexp, Pattern.LITERAL).matcher(addressStr).group();

Идея здесь состоит в том, чтобы получить совпадающую строку, а не пытаться заменить все остальное пустым. Вы можете извлечь шаблон в поле, если эта операция повторяется.

...