java.util.regex和org.apache.regexp之间的区别?

时间:2011-12-13 16:26:16

标签: java regex apache

我试过这段代码:

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说有些字符串是真的,但它们不是。

2 个答案:

答案 0 :(得分:0)

你的表达式没有声明它必须匹配整个输入,因此我假设在my.name-here@m@y.domain-here.ext Apache Regexp匹配m@y.domain-here.ext部分(尽管我不太了解Apache RegexP并且它已经退役,顺便说一句。

用^和$包装正则表达式,使其与整个输入匹配。

来自Matcher#matches()上的JavaDoc(Pattern.matches(...)调用该方法,从JavaDoc可以看到):

  

尝试将整个区域与模式匹配

编辑

我刚刚在RegexP小程序中测试了你的表达式,看起来你必须在你的角色类中逃避文字-(这无论如何都是好的做法)。这个表达似乎在RegexP中起作用:

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

顺便说一下,你可能想要添加非捕获组来优化表达式,即代替(\\.)你写(?:\\.)等。

答案 1 :(得分:0)

我想在这里提供旁注。可悲的是,电子邮件正则表达式几乎普遍错误。这是标准所描述的电子邮件地址的有效正则表达式。 http://www.ex-parrot.com/pdw/Mail-RFC822-Address.html

我注意到"hi@dog"@example.com是一个有效的电子邮件地址,由于正则表达式中只有一个@,因此无法在许多网站上使用。