奇怪的正则表达式行为

时间:2017-12-21 08:05:39

标签: java regex email

我有一个注释可以验证进入我们的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 {};
}

我测试了regex planet(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}以查看它是否可以使用加号专门匹配电子邮件,但没有运气。

所以似乎正则表达式只能匹配加号......还是我错过了一些明显的东西?

1 个答案:

答案 0 :(得分:0)

当发送诸如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}