Почему это регулярное выражение не работает - PullRequest
1 голос
/ 19 января 2012

Я пытался использовать следующий вид регулярных выражений

([_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*(\.[a-z]{2,4}))|(FakeEmail:)|(Email:)|(\1\2)|(\1\3)

(представьте, что \ 1 - это группа регулярных выражений электронной почты, а \ 2 - это FakeEmail: а \ 3 - это электронная почта: потому что я не подсчитал парены, чтобы выяснить реальную группировку)

То, что я пытаюсь сделать, это сказать: «Найти слово« электронная почта », и если вы найдете его, выберите любой адрес электронной почты, следующий за словом».

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

моя тестовая строка может быть что-то вроде

    "This guy is spamming me from
FakeEmail: fakeemailAdress@someplace.com
 but here is is real info:
Email: testemail@someplace.com"

Есть советы? Спасибо

Ответы [ 3 ]

0 голосов
/ 19 января 2012

Попробуйте:

(Fake)?Email: *([_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*(\.[a-z]{2,4}))

И захваченная группа \1 будет пустой, если это реальное электронное письмо, и будет содержать "Поддельное", если это поддельное электронное письмо, тогда как \2 будет само электронное письмо.1006 *

Вы действительно хотите захватить это, если это FakeEmail хотя?Если вы хотите захватить все Email, но игнорировать все FakeEmail, выполните:

\bEmail: *([_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*(\.[a-z]{2,4}))

Граница слова не позволяет биту Email соответствовать "FakeEmail".

ОБНОВЛЕНИЕ : обратите внимание, что ваше регулярное выражение соответствует только нижнему регистру, так как оно есть a-z в [] везде, но не [A-Z].Убедитесь, что вы вводите свое регулярное выражение в функцию соответствия Java с помощью переключателя игнорирования регистра.т.е.:

Pattern.compile("(Fake)?Email: .....", Pattern.CASE_INSENSITIVE)
0 голосов
/ 19 января 2012

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

String text = "This guy is spamming me from\n" +
    "FakeEmail: fakeemail+Adress@someplace.com\n" +
    "fakeEmail: \n" +
    "fakeemail@someplace.com" +
    "but here is is real info:\n" +
    "Email: test.email+info@someplace.com\n";

Matcher m = Pattern.compile("(?i)(?s)Email:\\s*([_a-z\\d\\+-]+(\\.[_a-z\\d\\+-]+)*@[a-z\\d-]+(\\.[a-z\\d-]+)*(\\.[a-z]{2,4}))").matcher(text);
while(m.find())
    System.out.printf("Email is [%s]%n", m.group(1));

Это будет соответствовать тексту электронной почты:

  • появляется в разных строках с помощью (?s)
  • игнорирование сравнения случаев с использованием (?i)
  • Адрес электронной почты с точкой .
  • Адрес электронной почты со знаком плюс +

ВЫХОД: Код сверху

Email is [fakeemail+Adress@someplace.com]
Email is [fakeemail@someplace.comb]
Email is [test.email+info@someplace.com]
0 голосов
/ 19 января 2012

Я либо совсем не понимаю, что вы пытаетесь сделать, либо ваш Regex просто очень неправ.В частности:

Почему у вас есть Email: в конце, а не в начале - в соответствии с вашим примером?

Почему у вас есть и Email:, и ваш \1\2разделенные символом трубы, почти как если бы они были в полях?Это компилирует шаблон как OR.(Найдите шаблон электронной почты, ИЛИ слово «Email:», ИЛИ все, что \1\2 в конечном итоге будет означать, что оно находится вне контекста здесь.)

Если все, что вы пытаетесь сделать, это сопоставить что-то вродеEmail: testemail@someplace.com, вам не нужно возвращаться назад.

Что-то вроде этого, вероятно, все, что вам нужно:

Email:\s+([_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*(\.[a-z]{2,4}))

Кроме того, я настоятельно рекомендую не пытаться проверить адрес электронной почтытак строгоВы можете прочитать http://haacked.com/archive/2007/08/21/i-knew-how-to-validate-an-email-address-until-i.aspx.Я бы упростил шаблон до чего-то более похожего на:

Email:\s+(\S+)*@(\S+\.\S+)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...