【问题标题】:Case-insensitive POSIX regex is not case-insensitive in Java Pattern & Matcher不区分大小写的 POSIX 正则表达式在 Java 模式和匹配器中不区分大小写
【发布时间】:2018-12-23 22:51:02
【问题描述】:

我不是正则表达式方面的专家,这可能是一个明显的原因,但我找不到答案。

我使用 POSIX 表示法以不区分大小写的方式在 Java 中使用 Regex 匹配字符串 (n)。给定:

Pattern pattern = Pattern.compile("\\p{Upper}", Pattern.CASE_INSENSITIVE); 
Matcher matcher = pattern.matcher("n");

为什么下面的代码会导致false

boolean find = matcher.find();

Pattern 文档中,我发现了以下内容(强调我的):

\p{Upper} 大写字母字符:[A-Z]

针对正则表达式[A-Z] 进行测试,true 中的结果如下:

Pattern pattern = Pattern.compile("[A-Z]", Pattern.CASE_INSENSITIVE); 
Matcher matcher = pattern.matcher("n");
boolean find = matcher.find();

有什么区别?

【问题讨论】:

  • 至少对于 openjdk 来说,您 are not the only one 似乎正在经历这种行为。
  • @Glains:太好了,就是这样!因此对于 Java 8 来说显然是一样的。不幸的是仍然标记为OPEN

标签: java regex string pattern-matching posix


【解决方案1】:

无论是对还是错 - Posix 字符类都会忽略 CASE_INSENSITIVE 标志。尽管 \p{Upper} 的工作方式与 [A-Z] 类似,但并不完全相同 - 而且它不会查看不区分大小写的标志。

Pattern 类中检查 posic 字符类的代码不引用 CASE_INSENSITIVE 标志:

/**
 * Node class that matches a POSIX type.
 */
static final class Ctype extends BmpCharProperty {
    final int ctype;
    Ctype(int ctype) { this.ctype = ctype; }
    boolean isSatisfiedBy(int ch) {
        return ch < 128 && ASCII.isType(ch, ctype);
    }
}

【讨论】:

    【解决方案2】:

    来自 POSIX 规范 (IEEE 1003):

    9.2 正则表达式一般要求

    当使用正则表达式的标准实用程序或函数指定执行模式匹配时不考虑数据或模式的大小写(大写或小写),那么当字符串中的每个字符都与模式匹配时,不只有字符,还有它的大小写对应物(如果有的话),都应该匹配。

    使用 POSIX 字符类时,Pattern.CASE_INSENSITIVE 不会使其忽略大小写对应检查。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-04-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多