Java 具有范围的 bean 验证大写字母

Java bean validation uppercase letters with range

我对 java bean 验证的模式有一些疑问。 我在 java class

中有一个变量模式
@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. 个人资料 - 正确
  2. P-真
  3. PRO - 正确
  4. PROFILEPROFILEPROFILEPROFILEPROF - 真
  5. PROFILEPROFILEPROFILEPROFILEPROFI - 错误
  6. 个人资料名称 - 错误
  7. 配置文件 1 - 正确
  8. PROFILE100 - 正确
  9. PROFILE1000 - 正确
  10. PROFILE1000000 - 正确
  11. 1111 - 错误
  12. PROFILEPROFILE123456789PROFILE123 - 错误
  13. profile_name - 错误
  14. *^^@ - 错误
  15. 个人资料名称 - 正确
  16. PROFILE_NAME - 真
  17. 简介。 - 真
  18. &)12p - 错误
  19. 11个人资料 - 正确
  20. 1234 配置文件 - 正确
  21. $%#PROFILE - 正确
  22. 无 - 错误

如何 change/refactor 该模式可以为大写字母添加范围,而 2、5、12 是否有效?

解法是“(?=.*[A-Z])[\p{标点}A-Z0-9 ]{1,32}”

您可以使用

@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} - 匹配 1 到 32 个大写 ASCII 字母、数字、space 或 Punct POSIX 字符 class 中的字符(它包括标点符号和符号)。