【问题标题】:Doesn @Pattern of javax.validation.constraints works with non-ASCII Unicode correct?javax.validation.constraints 的@Pattern 是否适用于非 ASCII Unicode 正确?
【发布时间】: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


【解决方案1】:

我的错误是在 Gradle 脚本中设置了错误的 UTF-8 编码。

compileJava.options.encoding = 'UTF-8'

在 build.gradle 和

systemProp.file.encoding=utf-8 

在 gradle.properties 实际上不起作用。只有

tasks.withType(JavaCompile) {
    options.encoding = "UTF-8"
}

在 build.gradle 中有效。使用此设置测试在两种环境中都是正确的。

【讨论】:

    【解决方案2】:

    我使用了一个简化的模式来证明 Unicode 支持有效。

        Pattern pattern = Pattern.compile("(?U)[-.\\p{L}]+");
        String s = "321";
        System.out.println(s + " -> " + pattern.matcher(s).matches());
        s = "mia-domajno.rf";
        System.out.println(s + " -> " + pattern.matcher(s).matches());
        s = "мой-домен.рф";
        System.out.println(s + " -> " + pattern.matcher(s).matches());
    

    将产生(如预期):

    321 -> false
    mia-domajno.rf -> true
    мой-домен.рф -> true
    

    所以罪魁祸首是正则表达式的组成。对此我目前还没有一个清晰的头脑。

    【讨论】:

    • 谢谢。我已经找到了真正的罪魁祸首——是我 :) 我在 Gradle 中错误地设置了编译器的编码
    猜你喜欢
    • 2021-10-18
    • 2018-01-05
    • 2011-07-10
    • 2013-09-21
    • 1970-01-01
    • 2015-04-22
    • 1970-01-01
    • 1970-01-01
    • 2012-05-08
    相关资源
    最近更新 更多