范围为

时间:2016-10-27 12:25:22

标签: java regex validation java-8 javabeans

我对java bean验证的模式有一些问题。 我在java类中有我的变量模式

@Pattern(regexp = ".*[A-Z]+[[A-Z]\\p{Space}]+[A-Z\\p{Punct}]+([0-9]{1,10})?", message = "Error")*
private String name;

实际上它正在工作,但现在我必须为大写单词添加范围{0,32}。 当我添加[A-Z] {0,32}时,它会崩溃

名称 应符合

以下的值
  1. PROFILE - true
  2. P - true
  3. PRO - true
  4. PROFILEPROFILEPROFILEPROFILEPROF - true
  5. PROFILEPROFILEPROFILEPROFILEPROFI - false
  6. profilename - false
  7. PROFILE1 - true
  8. PROFILE100 - true
  9. PROFILE1000 - true
  10. PROFILE1000000 - true
  11. 1111 - false
  12. PROFILEPROFILE123456789PROFILE123 - false
  13. profile_name - false
  14. * ^^ @ - false
  15. 个人资料名称 - 真实
  16. PROFILE_NAME - true
  17. PROFILE。 - 真的
  18. &)12p - false
  19. 11PROFILE - true
  20. 1234PROFILE - true
  21. $%#PROFILE - true
  22. nothing - false
  23. 如何更改/重构该模式以便为大写字母和2,5,12添加范围可行?

    解决方案是“(?=。* [A-Z])[\ p {Punct} A-Z0-9] {1,32}”

1 个答案:

答案 0 :(得分:2)

您可以使用

@Pattern(regexp = "(?=.*[A-Z])[\\p{Punct}A-Z0-9 ]{1,32}", message = "Error")

请参阅regex demo

由于模式默认是锚定的(它与.matches()方法一起使用),因此模式周围不需要^$

匹配:

  • (?=.*[A-Z]) - 在除了换行符之外的任何0+字符之后,必须至少有1个大写ASCII字母
  • [\\p{Punct}A-Z0-9 ]{1,32} - 匹配Punct POSIX字符类中的1到32个大写ASCII字母,数字,空格或字符(包括标点符号和符号)。