Java Bean 验证和正则表达式 - 两种不同错误消息中的格式和长度

Java Bean validation and regex - format and length in two different error message

例如输入phone个数。格式为

(国家代码)(space)(区号)(space)(phone号码)

区号可以为空

e.g.
63 240 1234567   (valid)
63 1234567  (valid)

我需要什么正则表达式模式才能让它检查是否所有字符都是数字以及 phone 数字(没有国家和地区代码)是否有一定长度?

并且是否有可能只使用一种模式,我可以为两个不同的无效输入提供两个不同的错误消息: 1.所有字符都应该是数字 2.实际Phone号码长度应该是7到10。

因为我们目前是这样的

@Pattern(regexp=" some regex pattern", message="phone is invalid")
private String phoneNumber

我可以添加一个@Size 验证器,但我只需要 trim 出 phone 数字。

有人可以帮忙吗?

这个表达式可以工作:

^(\d{2})\s(?:(\d{3})\s)?(\d{7,10})$

解释:

  • ^ 字符串开头
  • (\d{2})\s 2 位数字,后接 space(国家代码)(space)
  • (?:(\d{3})\s)?(可选)3 位数字,后接 space(区号)(space)
  • (\d{7,10}) 7 到 10 位数字
  • $ 字符串结束

Example

限制:

  • 它将匹配 63 240 123456763 1234567 之类的东西,但它不会匹配 63123456763 240 1234567,它期望在每个之后有一个 space那些部分。解决这些限制很容易,但这取决于您需要的验证级别。如果 space 是可选的,您可以将 \s 替换为 \s?

变体

如果您希望所有 space 和国家代码都是可选的,这里有一个变体:^(?:(\d{2})\s?)?(?:(\d{3})\s?)?(\d{7,10})$

代码示例

如果您想按顺序评估这两种模式,您可以使用此答案 (),对于 Java 代码,结合上面的两个正则表达式。

@GroupSequence({First.class, Second.class})
public interface Sequence {}

@Size(min = 2, max = 10, message = "Name length improper", groups = { First.class })
@Pattern(regexp = "T.*", message = "Name doesn't start with T" , groups = { Second.class })
private String name;

When now validating a Bean instance using the defined sequence (validator.validate(bean, Sequence.class)), at first the @Size constraint will be validated and only if that succeeds the @Pattern constraint.

类似的东西:

 @GroupSequence({First.class, Second.class})
 public interface Sequence {}

 @Pattern(regexp = "^[ \d]+$", message = "Numeric input required" , groups = { First.class })
 @Pattern(regexp = "^(?:(\d{2})\s?)?(?:(\d{3})\s?)?(\d{7,10})$", message = "Phone no. should be 7-10 in length" , groups = { Second.class })
 private String phoneNumber;