【问题标题】:Java - Extract email address from requestURI with regexJava - 使用正则表达式从 requestURI 中提取电子邮件地址
【发布时间】:2016-02-24 13:58:17
【问题描述】:

我正在尝试从 requestURI 中提取电子邮件地址,下面的正则表达式是基于 RFC-2822 的电子邮件正则表达式,它适用于验证

private final transient String EMAIL_REGEX = 
            "^([^\\x00-\\x20\\x22\\x28\\x29\\x2c\\x2e\\x3a-\\x3c\\x3e\\x40\\x5b-\\x5d\\x7f-\\xff]"
            + "+|\\x22([^\\x0d\\x22\\x5c\\x80-\\xff]|\\x5c[\\x00-\\x7f])*\\x22)"
            + "(\\x2e([^\\x00-\\x20\\x22\\x28\\x29\\x2c\\x2e\\x3a-\\x3c\\x3e\\x40\\x5b-\\x5d\\x7f-\\xff]+"
            + "|\\x22([^\\x0d\\x22\\x5c\\x80-\\xff]|\\x5c[\\x00-\\x7f])*\\x22))"
            + "*\\x40([^\\x00-\\x20\\x22\\x28\\x29\\x2c\\x2e\\x3a-\\x3c\\x3e\\x40\\x5b-\\x5d\\x7f-\\xff]+"
            + "|\\x5b([^\\x0d\\x5b-\\x5d\\x80-\\xff]|\\x5c[\\x00-\\x7f])*\\x5d)"
            + "(\\x2e([^\\x00-\\x20\\x22\\x28\\x29\\x2c\\x2e\\x3a-\\x3c\\x3e\\x40\\x5b-\\x5d\\x7f-\\xff]"
            + "+|\\x5b([^\\x0d\\x5b-\\x5d\\x80-\\xff]|\\x5c[\\x00-\\x7f])*\\x5d))*$";

我正在尝试重用相同的正则表达式来匹配并从 URI /something/users/myemail@email.com/somethingelse 中提取电子邮件地址,使用 Matcher.group(0) 我得到输出 /something/users/myemail@email.com 其中我的预期输出只是来自 URI 的电子邮件地址.

【问题讨论】:

  • 您是否尝试删除 $^
  • 刚试过,返回整个字符串,我想只提取电子邮件地址..
  • 整件事情都在逃跑有什么原因吗?
  • 检查this demo。我在开头和结尾的两个否定字符类中添加了/

标签: java regex


【解决方案1】:

我想出了这个正则表达式更新:

private static String EMAIL_REGEX =
        "([^/\\x00-\\x20\\x22\\x28\\x29\\x2c\\x2e\\x3a-\\x3c\\x3e\\x40\\x5b-\\x5d\\x7f-\\xff]"
        + "+|\\x22([^\\x0d\\x22\\x5c\\x80-\\xff]|\\x5c[\\x00-\\x7f])*\\x22)"
        + "(\\x2e([^\\x00-\\x20\\x22\\x28\\x29\\x2c\\x2e\\x3a-\\x3c\\x3e\\x40\\x5b-\\x5d\\x7f-\\xff]+"
        + "|\\x22([^\\x0d\\x22\\x5c\\x80-\\xff]|\\x5c[\\x00-\\x7f])*\\x22))"
        + "*\\x40([^\\x00-\\x20\\x22\\x28\\x29\\x2c\\x2e\\x3a-\\x3c\\x3e\\x40\\x5b-\\x5d\\x7f-\\xff]+"
        + "|\\x5b([^\\x0d\\x5b-\\x5d\\x80-\\xff]|\\x5c[\\x00-\\x7f])*\\x5d)"
        + "(\\x2e([^/\\x00-\\x20\\x22\\x28\\x29\\x2c\\x2e\\x3a-\\x3c\\x3e\\x40\\x5b-\\x5d\\x7f-\\xff]"
        + "+|\\x5b([^\\x0d\\x5b-\\x5d\\x80-\\xff]|\\x5c[\\x00-\\x7f])*\\x5d))*";

请注意开头和倒数第二行的[^/\\x00

online demo

String s = "/something/users/myemail@email.com/somethingelse";         
Matcher m = Pattern.compile(EMAIL_REGEX).matcher(s);
while (m.find())
{
    System.out.println(m.group());
} // => myemail@email.com

【讨论】:

    猜你喜欢
    • 2016-04-28
    • 2010-12-20
    • 1970-01-01
    • 2020-07-14
    • 1970-01-01
    • 1970-01-01
    • 2011-01-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多