Java bean 验证带范围的大写字母

标签 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. 个人资料 - 真实
  2. P - 正确
  3. PRO - 正确
  4. PROFILEPROFILEPROFILEPROF - true
  5. PROFILEPROFILEPROFILEPROFI - false
  6. 个人资料名称 - false
  7. 配置文件1 - 正确
  8. PROFILE100 - 正确
  9. PROFILE1000 - 正确
  10. PROFILE1000000 - 正确
  11. 1111 - 错误
  12. PROFILEPROFILE123456789PROFILE123 - 假
  13. 个人资料名称 - false
  14. *^^@ - 假
  15. 个人资料名称 - true
  16. PROFILE_NAME - 正确
  17. 个人资料。 - 正确
  18. &)12p - 假
  19. 11PROFILE - 正确
  20. 1234PROFILE - 正确
  21. $%#PROFILE - true
  22. 什么都没有 - 假

如何更改/重构该模式以添加大写字母的范围,并且 2、5、12 可以工作?

解决方案是“(?=.*[A-Z])[\p{Punct}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} - 匹配 Punct POSIX 字符类中的 1 到 32 个大写 ASCII 字母、数字、空格或字符(它包括标点符号和符号)。

关于Java bean 验证带范围的大写字母,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40284533/

相关文章:

java - 从外部更改和更新 JPanel 组件,JFrame 不起作用,Swing

validation - Codeigniter 验证——如何限制数值?

javascript - 在 Scala Play 框架中使用 javascript 进行电子邮件验证?

java - 获取固定长度的子串匹配模式

桌面应用程序中的 JavaBeans 验证

java - 如何使用CDI从请求中获取 token ?

java - SWT 文本组件不会水平填充

java - JPA2 EntityManager 为空

c++ - 使用正则表达式regex_search在字符串中查找字符串

c# - 密码的按需正则表达式