繁体   English   中英

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

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

例如,输入为电话号码。 格式为

(国家代码)(空格)(区域代码)(空格)(电话号码)

区号可以为空白。

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

我需要哪种正则表达式模式,以便可以检查所有字符是否都是数字,以及电话号码(不含国家和地区代码)是否具有一定长度?

并且有可能仅使用一种模式,对于两个不同的无效输入,我可能会有两个不同的错误消息:1.所有字符应为数字2.实际电话号码长度应为7到10。

因为我们目前有这种方式

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

我可以添加一个@Size验证器,但是我只需要修剪电话号码。

有人可以帮忙吗?

该表达式可以工作:

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

说明:

  • ^字符串开头
  • (\\d{2})\\s 2位数字,后跟一个空格(国家代码)(空格)
  • (?:(\\d{3})\\s)? (可选)3位数字,后跟一个空格(区号)(空格)
  • (\\d{7,10}) 7到10位数字
  • $字符串结尾

局限性:

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

变体

如果您希望所有空格和国家/地区代码为可选,请使用以下变体: ^(?:(\\d{2})\\s?)?(?:(\\d{3})\\s?)?(\\d{7,10})$

代码样例

如果您希望按顺序评估这两种模式,则可以使用以下答案( https://stackoverflow.com/a/41603564/7400458 ),针对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; 

现在,当使用定义的序列(validator.validate(bean,Sequence.class))验证Bean实例时,首先将验证@Size约束,并且前提是该约束必须成功@Pattern约束。

像这样:

 @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;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM