\ s实际上并未捕获所有空格字符

Jac*_*ole 4 java regex unicode java-8

在我的Java 8应用程序中,我正在扫描传入的文本中的空格。但是\s在我的正则表达式中,并不能捕获所有空格。我发现到目前为止,在我的测试中尚未捕获的一个空格是“ 不间断空格”(Unicode 00A0)。这是我遇到的问题的正则表达式:

Pattern p = Pattern.compile("\\s");
Run Code Online (Sandbox Code Playgroud)

为了解决这个问题,我添加\h了我的正则表达式:

Pattern p = Pattern.compile("[\\s\\h]");
Run Code Online (Sandbox Code Playgroud)

现在,我还有其他需要注意的空白\s\h吗?

Hol*_*ger 6

默认情况下,\s仅匹配ASCII空格字符([ \t\n\x0B\f\r])。有两种方法可以克服此限制

  1. 使用Unicode字符属性: Pattern.compile("\\p{IsWhiteSpace}")

  2. 使预定义字符类使用Unicode属性:
    Pattern.compile("\\s", Pattern.UNICODE_CHARACTER_CLASS)
    这也可以通过嵌入标志启用(?U)

Pattern[] pattern = {
    Pattern.compile("\\s"),
    Pattern.compile("\\s", Pattern.UNICODE_CHARACTER_CLASS),
    Pattern.compile("((?U)\\s)"),
    Pattern.compile("\\p{IsWhiteSpace}")
};
String s = " \t\n\u00A0\u2002\u2003\u2006\u202F";
for(Pattern p: pattern) {
    int count = 0;
    for(Matcher m = p.matcher(s); m.find(); ) count++;
    System.out.printf("%-19s: %d matches%n",
      p.pattern()+((p.flags()&Pattern.UNICODE_CHARACTER_CLASS)!=0? " [(?U) via flags]": ""),
      count);
}
Run Code Online (Sandbox Code Playgroud)
Pattern[] pattern = {
    Pattern.compile("\\s"),
    Pattern.compile("\\s", Pattern.UNICODE_CHARACTER_CLASS),
    Pattern.compile("((?U)\\s)"),
    Pattern.compile("\\p{IsWhiteSpace}")
};
String s = " \t\n\u00A0\u2002\u2003\u2006\u202F";
for(Pattern p: pattern) {
    int count = 0;
    for(Matcher m = p.matcher(s); m.find(); ) count++;
    System.out.printf("%-19s: %d matches%n",
      p.pattern()+((p.flags()&Pattern.UNICODE_CHARACTER_CLASS)!=0? " [(?U) via flags]": ""),
      count);
}
Run Code Online (Sandbox Code Playgroud)


小智 4

根据Pattern类文档,匹配的字符\s\t\n\x0B\f\r.

然而,Unicode 确实支持更多的空格字符。示例包括:

  • \u2002: 空间
  • \u2003: 空格
  • \u2003: 狭小的空间
  • \u202F:狭窄的不间断空间