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吗?
默认情况下,\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);
}
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)
| 归档时间: |
|
| 查看次数: |
139 次 |
| 最近记录: |