Java Regex странная вещь - PullRequest
       0

Java Regex странная вещь

1 голос
/ 15 марта 2012

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

regexp = "(\\w+)(\\(at\\))((\\w+\\.)+)([a-z]{2,3})";

Предположим, у меня есть входные данные "madrugada (at) yahoo.co.uk ", в результате выдается madrugada@yahoo.co.co.uk.

pattern = Pattern.compile (regexp);
m = pattern.matcher (my_input);
while (m.find()) {
    for (int i=0; i<=m.groupCount(); i++)
         // it would give out: madrugada (at) yahoo co co uk
}

Спасибо

Ответы [ 3 ]

3 голосов
/ 15 марта 2012

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

Попробуйте это

regexp = "(\\w+)(\\(at\\))(\\w+\\.)+([a-z]{2,3})";

Edit: Кажется, что альтернативный RegEx, использующий группы без захвата, решил бы проблему.

regexp = "(\\w+)(\\(at\\))((?:\\w+\\.)+)([a-z]{2,3})";
1 голос
/ 15 марта 2012

Вы также не хотите включать m.group (0), так как он содержит весь сегмент, который соответствует вашему общему RE.

for (int i=1;i<=m.groupCount();i++) {
  System.out.println(m.group(i));
}
1 голос
/ 15 марта 2012
import java.util.regex.*;
String a="madrugada(at)yahoo.co.in.ro.uk";
String regexp="(\\w+)(\\(at\\))(\\w+)((?:\\.\\w+)*)(\\.[a-z]{2,3})";
Pattern pattern = Pattern.compile (regexp);
Matcher m = pattern.matcher (a);
while (m.find()) {
    for (int i=0; i<=m.groupCount(); i++)
         println m.group(i);
}

производит следующий вывод:

madrugada(at)yahoo.co.in.ro.uk
madrugada
(at)
yahoo
.co.in.ro
.uk

РЕДАКТИРОВАТЬ:

Обновлен выше с группой без захвата.Причина, по которой он не работал раньше, заключается в том, что, несмотря на то, что он соответствовал нескольким .\w+ шаблонам, обратная ссылка была только на последнюю.Также изменил группу без захвата на * для размещения madrugada(at)yahoo.uk

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...