【问题标题】:Odd regex behaviour奇怪的正则表达式行为
【发布时间】:2018-06-03 20:50:09
【问题描述】:

我有一个注释可以验证进入我们 REST API 的电子邮件地址。 在大多数情况下,它都做得很好,但是由于某种原因,它在包含“+”号的电子邮件中中断,例如mail+mail@mail.com

@NotNull
@Pattern(regexp = "[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,4}")
@ReportAsSingleViolation
@Constraint(validatedBy = {})
@Documented
@Target({METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER})
@Retention(RUNTIME)
public @interface Email {

    String message() default "Not a valid email!";

    Class<?>[] groups() default {};

    Class<? extends Payload>[] payload() default {};
}

我已经在正则表达式星球 (http://www.regexplanet.com/advanced/java/index.html) 上测试了正则表达式,它可以工作并且正则表达式与完整的邮件地址匹配。

只是为了验证它确实在做某事,我尝试将正则表达式更改为 .+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,4} 并且有效。 我还测试了[A-Za-z0-9]+\\+[A-Za-z0-9]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,4},看看它是否可以匹配带有加号的特定电子邮件,但没有运气。

所以似乎正则表达式无法匹配加号......还是我遗漏了一些明显的东西?

【问题讨论】:

  • 你原来的正则表达式already works for me。你能给我们一个可重现的例子吗?
  • 我在regex101.com 测试了正则表达式,mail+mail@mail.com 也适用于表达式[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,4}。你确定你匹配的字符串编码正确吗?
  • 我会尽力制作一个“小”可重现的例子。 @OscardeLeeuw 您可能会遇到一些问题,因为它是一个查询参数......可能没有正确解码 url
  • 注意加号可以编码为&amp;#x002B;或类似的。尝试将&amp;; 添加到第一个字符类的开头。
  • 目前在 [A-Za-z0-9._%+#&amp;;-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,4} 上没有运气,所以如果它是 url 编码的,那么它不是以“传统”方式编码的......或者我写错了正则表达式

标签: java regex email


【解决方案1】:

当发送mail+mail@mail.com之类的邮件作为查询参数时,会在去码的路上进行编码。所以在 servlet 应用程序中,它看起来像 mail mail@mail.com,这看起来很不合常规。 这是使用 jersey 和 javax.javaee-api 作为 java ee 实现进行测试的。

所以解决这个问题的方法是在正则表达式中添加一个空格。 [A-Za-z0-9 ._%-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,5}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-17
    • 2013-07-13
    • 2012-03-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多