【发布时间】: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
-
注意加号可以编码为
&#x002B;或类似的。尝试将&;添加到第一个字符类的开头。 -
目前在
[A-Za-z0-9._%+#&;-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,4}上没有运气,所以如果它是 url 编码的,那么它不是以“传统”方式编码的......或者我写错了正则表达式