我有一个注释可以验证进入我们的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}
以查看它是否可以使用加号专门匹配电子邮件,但没有运气。
所以似乎正则表达式只能匹配加号......还是我错过了一些明显的东西?
答案 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}