【问题标题】:Difference between java.util.regex and org.apache.regexp?java.util.regex 和 org.apache.regexp 之间的区别?
【发布时间】:2012-01-19 12:34:19
【问题描述】:

我试过这段代码:

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

【问题讨论】:

  • 请提供更多细节!使用 apache.regexp 究竟是什么不起作用?
  • RE:“请提供更多详细信息!使用 apache.regexp 究竟有什么问题?”模式确实匹配正确(除了第一个之外都是假的),RE 说有人字符串是真的,但他们不是。

标签: java regex apache


【解决方案1】:

您的表达式并未声明它必须匹配整个输入,因此我假设在 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]+$"

顺便说一句,您可能想要添加非捕获组以稍微优化表达式,即您可以写 (?:\\.) 等,而不是 (\\.)

【讨论】:

  • 天哪,谢谢!这就是问题所在!与 apache 正则表达式相反,模式不需要转义“-”字符:D
【解决方案2】:

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

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

【讨论】:

  • 感谢您的回答,我想像您一样,但此正则表达式是基于外部请求的。我的意图是 "hi@dog"@example.com 返回 false。
  • 实际上,regular-expressions.info 对 RFC822 地址有一个很好的通用表达式。他们还指出,由于双引号地址等很少使用,因此仍有一个更短且更易读的表达式仍然匹配 99.9% 的正在使用的电子邮件地址。
猜你喜欢
  • 1970-01-01
  • 2021-12-25
  • 2020-05-10
  • 2014-09-20
  • 2010-10-28
  • 2015-10-04
  • 2012-08-12
  • 2011-02-18
  • 2019-12-21
相关资源
最近更新 更多