【问题标题】:Java bean validation uppercase letters with rangeJava bean验证大写字母与范围
【发布时间】:2016-10-27 12:25:22
【问题描述】:

我对 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. 专业版 - 是的
  4. PROFILEPROFILEPROFILEPROFILEPROF - 是的
  5. PROFILEPROFILEPROFILEPROFILEPROFI - 错误
  6. 个人资料名称 - 错误
  7. PROFILE1 - 真
  8. PROFILE100 - 真
  9. PROFILE1000 - 真
  10. PROFILE1000000 - 真
  11. 1111 - 错误
  12. PROFILEPROFILE123456789PROFILE123 - 假
  13. profile_name - 错误
  14. *^^@ - 错误
  15. 个人资料名称 - 真
  16. PROFILE_NAME - 是的
  17. 简介。 - 是的
  18. &)12p - 错误
  19. 11个人资料 - 真
  20. 1234PROFILE - 真
  21. $%#PROFILE - 真
  22. 什么都没有 - 错误

如何更改/重构该模式以增加大写字母的范围以及 2、5、12 是否可行?

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

【问题讨论】:

  • 完整的模式是什么?
  • 实际上它是完整的模式并且它正在工作但是当我想为大写字母添加范围时 [A-Z]{0,32} 它打破了如何更改/重构该模式以可能添加大写的范围信?
  • 添加范围是什么意思?
  • 我的意思是名字应该是最小 - 1 和最大 - 32 个字符
  • 有什么要求?正则表达式需要彻底改造,恕我直言。

标签: java regex validation java-8 javabeans


【解决方案1】:

你可以使用

@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 字母、数字、空格或字符(包括标点符号和符号)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-12
    • 2016-12-20
    • 1970-01-01
    相关资源
    最近更新 更多