我对 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} 时,它崩溃了
名称应符合以下值
- 个人资料 - 真实
- P - 正确
- PRO - 正确
- PROFILEPROFILEPROFILEPROF - true
- PROFILEPROFILEPROFILEPROFI - false
- 个人资料名称 - false
- 配置文件1 - 正确
- PROFILE100 - 正确
- PROFILE1000 - 正确
- PROFILE1000000 - 正确
- 1111 - 错误
- PROFILEPROFILE123456789PROFILE123 - 假
- 个人资料名称 - false
- *^^@ - 假
- 个人资料名称 - true
- PROFILE_NAME - 正确
- 个人资料。 - 正确
- &)12p - 假
- 11PROFILE - 正确
- 1234PROFILE - 正确
- $%#PROFILE - true
- 什么都没有 - 假
如何更改/重构该模式以添加大写字母的范围,并且 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/