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

时间:2019-06-18 16:19:33

标签: java regex unicode java-8

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

Pattern p = Pattern.compile("\\s");

为解决此问题,我在我的正则表达式中添加了\h

Pattern p = Pattern.compile("[\\s\\h]");

现在,我还有其他空白需要\s\h捕获吗?

3 个答案:

答案 0 :(得分:5)

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

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

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

  3. 启用它
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);
}
\s                 : 3 matches
\s [(?U) via flags]: 8 matches
((?U)\s)           : 8 matches
\p{IsWhiteSpace}   : 8 matches

答案 1 :(得分:3)

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

但是,Unicode确实支持更多space characters。示例包括:

  • \u2002:在太空中
  • \u2003:Em空格
  • \u2003:稀薄空间
  • \u202F:狭窄的不间断空间

答案 2 :(得分:1)

为此,我们使用guava ...

String s = " \t\n\u00A0\u2002\u2003\u2006\u202F";
int b = CharMatcher.whitespace().countIn(s);
System.out.println(b); // 8