在Java 8应用程序中,我正在扫描传入的文本中的空格。但是,我的正则表达式中的\s
不能捕获所有空格。我发现到目前为止在测试中尚未捕获到的一个空格是Non-breaking Space(Unicode 00A0)。这是我正则表达式遇到的问题:
Pattern p = Pattern.compile("\\s");
为解决此问题,我在我的正则表达式中添加了\h
:
Pattern p = Pattern.compile("[\\s\\h]");
现在,我还有其他空白需要\s\h
捕获吗?
答案 0 :(得分:5)
默认情况下,\s
仅匹配ASCII空格字符([ \t\n\x0B\f\r]
)。有两种方法可以克服此限制
使用Unicode字符属性:Pattern.compile("\\p{IsWhiteSpace}")
使预定义字符类使用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);
}
\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