Java - 使用正则表达式从 requestURI 中提取电子邮件地址

标签 java regex

我尝试使用下面的正则表达式从 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 中的电子邮件地址。

最佳答案

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

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

关于Java - 使用正则表达式从 requestURI 中提取电子邮件地址,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33854488/

相关文章:

java - 在Java中使用距离公式

python - 正则表达式 "dynamic"替换

PHP preg_match() 返回最后一次匹配的位置

regex - 使用 Perl 从句子中提取小数和整数

javascript - 通过正则表达式删除标签符号 js

python - 该日期需要正则表达式模式

java - 如何在 ANTLR 3 树解析器中表达多个节点

java - 如何输入将分配给变量的字符串?

java - 为什么在java8中使用 "default"关键字

java - 将 IBM MQ 迁移到 javax.jms.* 实现 - MQOPEN 如何转换为 JMS API?