我需要验证输入的域名。我使用javax.validation和hibernate-validator:6.0.9.Final来实现此功能。
我的正则表达式是
在java.util.regex.Pattern类的javadoc中,他们说内嵌的标志表达式(?U)仅适用于US-ASCII符号:
谁错了:hibernate-validator只与US-ASCII一起使用,还是IDEA可以处理所有Unicode字母(包括非ASCII字符)?为什么从IDEA运行的测试和从Gradle运行的测试在相同的JVM中表现不同?是否设置了不同的命令行参数?我在IDEA和Gradle脚本中都将文件编码设置为UTF-8。
我的正则表达式是
((([\p{L}0-9])+(-?[\p{L}0-9])*)\.)*[\p{L}0-9](-?[\p{L}0-9])+\.\p{L}{2,}
。另外,我尝试在@Pattern注释中使用标志(?U)
而不是\p{L}
,如\p{Alpha}
。它在IntelliJ IDEA等工具中可以工作。所以我将其放入@Pattern注释中。从IDEA运行的测试可以正常工作。但是从Gradle运行的测试无法识别非ASCII字符的域名,例如,西里尔字母域名“мой-домен.рф”会导致ConstraintViolationException异常。在java.util.regex.Pattern类的javadoc中,他们说内嵌的标志表达式(?U)仅适用于US-ASCII符号:
因此,我可以同意当指定此标志时,则(仅限US-ASCII)预定义字符类和POSIX字符类符合Unicode技术标准#18:Unicode正则表达式附录C:兼容性属性。
\p{Alpha}
可能无法处理非ASCII字母。但是为什么\p{L}
不起作用?谁错了:hibernate-validator只与US-ASCII一起使用,还是IDEA可以处理所有Unicode字母(包括非ASCII字符)?为什么从IDEA运行的测试和从Gradle运行的测试在相同的JVM中表现不同?是否设置了不同的命令行参数?我在IDEA和Gradle脚本中都将文件编码设置为UTF-8。
\p{L}
不需要UNICODE_CHARACTER_CLASS
标志来匹配Unicode字母,它默认就可以。 - Wiktor Stribiżew