Разница между java.util.regex и org.apache.regexp? - PullRequest
1 голос
/ 13 декабря 2011

Я попробовал этот код:

public static void main(String[] args) throws Exception {
        String regexp = "[\\w-]+(\\.[\\w-]+)*@[\\w-]+(\\.[\\w-]+)*(\\.)[a-zA-Z]+";    

        String text1 = "my.name-here@my.domain-here.ext";
        String text2 = "my.name-here@m@y.domain-here.ext";
        String text3 = "@domain-here.ext";
        String text4 = "my.name-here@";
        String text5 = "my.name-here@domain-here";
        String text6 = ".my.name-here@my.domain-here.ext";
        String text7 = "my.name-here.@my.domain-here.ext";
        String text8 = "my.name-here@.my.domain-here.ext";
        String text9 = "my.name-here@my.domain-here.ext.";
        String text10 = "my.na me-here@my.domain-here.ext";
        String text11 = "my.name-here@my.dom ain-here.ext";
        String text12 = "my..name-here@my.domain-here.ext";
        String text13 = "my.name-here@my..domain-here.ext";

        RE re = new RE(regexp);
        System.out.println(re.match(text1));
        System.out.println(re.match(text2));
        System.out.println(re.match(text3));
        System.out.println(re.match(text4));
        System.out.println(re.match(text5));
        System.out.println(re.match(text6));
        System.out.println(re.match(text7));
        System.out.println(re.match(text8));
        System.out.println(re.match(text9));
        System.out.println(re.match(text10));
        System.out.println(re.match(text11));
        System.out.println(re.match(text12));
        System.out.println(re.match(text13));

        System.out.println(Pattern.matches(regexp, text1));
        System.out.println(Pattern.matches(regexp, text2));
        System.out.println(Pattern.matches(regexp, text3));
        System.out.println(Pattern.matches(regexp, text4));
        System.out.println(Pattern.matches(regexp, text5));
        System.out.println(Pattern.matches(regexp, text6));
        System.out.println(Pattern.matches(regexp, text7));
        System.out.println(Pattern.matches(regexp, text8));
        System.out.println(Pattern.matches(regexp, text9));
        System.out.println(Pattern.matches(regexp, text10));
        System.out.println(Pattern.matches(regexp, text11));
        System.out.println(Pattern.matches(regexp, text12));
        System.out.println(Pattern.matches(regexp, text13));
    }

Только первый должен быть прав, но ... org.apache.regexp.RE делает что-то не так. Любое решение? Большое спасибо. Я должен сделать это с org.apache.regexp.RE обязательно.

Обновление: Паттерн действительно соответствует (все ложные, кроме первого), RE говорит, что кто-то String верен, но это не так.

Ответы [ 2 ]

0 голосов
/ 13 декабря 2011

Я хотел бы предложить ответ побочной заметки здесь.К сожалению, регулярные выражения по электронной почте почти всегда неверны.Вот действительное регулярное выражение для адресов электронной почты, как описано в стандарте.http://www.ex -parrot.com / pdw / Mail-RFC822-Address.html

Я хотел бы отметить, что "hi@dog"@example.com является действительным адресом электронной почты и недопустим для использования на многих веб-сайтах.из-за одного @ в регулярном выражении.

0 голосов
/ 13 декабря 2011

Ваше выражение не утверждает, что оно должно соответствовать всему вводу, и поэтому я предполагаю, что в пределах my.name-here@m@y.domain-here.ext Apache Regexp соответствует части m@y.domain-here.ext (хотя я не знаю Apache RegexP так хорошо, и он удален, кстати).

Оберните свое регулярное выражение с помощью ^ и $, чтобы оно соответствовало всему вводу.

Из JavaDoc на Matcher#matches() (Pattern.matches(...) вызывает этот метод, как вы можете видеть из его JavaDoc):

Попытки сопоставить всю область с шаблоном

Редактировать

Я только что проверил вашувыражением в апплете RegexP, и кажется, что вы должны экранировать литерал - в ваших классах персонажей (что в любом случае является хорошей практикой).Это выражение работает в RegexP:

"^[\\w\\-]+(\\.[\\w\\-]+)*@[\\w\\-]+(\\.[\\w\\-]+)*(\\.)[a-zA-Z]+$"

Кстати, вы можете добавить группы без захвата, чтобы немного оптимизировать выражение, то есть вместо (\\.) вы бы написали (?:\\.) и т. Д.

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