【发布时间】:2018-04-18 16:07:19
【问题描述】:
我需要验证输入的域名。为此,我使用 javax.validation 和 hibernate-validator:6.0.9.Final。
我的正则表达式是((([\p{L}0-9])+(-?[\p{L}0-9])*)\.)*[\p{L}0-9](-?[\p{L}0-9])+\.\p{L}{2,} 我也尝试了\p{Alpha} 带有标志(?U) 而不是\p{L}。例如,它适用于 IntelliJ IDEA。所以我把它放到@Pattern 注释中。从 IDEA 测试运行正常。但是从 Gradle 运行的测试不起作用 - 验证器无法识别具有非 ACII 字符的域名,例如,西里尔文域“мой-домен.рф”会导致 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 字母?为什么来自 IDEA 的测试运行有效,而来自 Gradle 的测试运行不使用相同的 JVM?设置了一些不同的命令行参数?我在 IDEA 和 Gradle 脚本中都将 UTF-8 设置为文件编码。
【问题讨论】:
-
您确定参考了相应的文档吗?在 Java 正则表达式中,
\p{L}不需要UNICODE_CHARACTER_CLASS标志来匹配 Unicode 字母,默认情况下需要。 -
我只将 (?U) 与 \p{Alpha} 一起使用。
标签: java regex validation unicode