启用Pattern.UNICODE_CHARACTER_CLASS标志时,我遇到了匹配某些标点符号的问题。
示例代码如下:
final Pattern p = Pattern.compile("\\p{Punct}",Pattern.UNICODE_CHARACTER_CLASS);
final Matcher matcher = p.matcher("+");
System.out.println(matcher.find());
输出是错误的,尽管在文档中明确指出p {Punct}包含诸如!"#$%&'()* +, - 。/:;<等字符。 =>?@ [] ^ _`{|}〜
除了' +'签名,以下字符$ +< => ^`|〜
也会出现同样的问题当删除Pattern.UNICODE_CHARACTER_CLASS时,它可以正常工作
我将很感激有关该问题的任何提示
答案 0 :(得分:4)
指定此标志时,(仅限US-ASCII)预定义 字符类和POSIX字符类符合 Unicode Technical Standard #18: Unicode Regular Expression Annex C:兼容性属性。
如果您查看UTS35(Unicode技术标准)的常规类别属性,您会看到符号(case BPred2bit:
p = &pred_dir->config.bimod.table[BIMOD_HASH(pred_dir, baddr)];
break;
和子类别)和标点符号({{1)之间的区别在常规类别属性下的table中的}和子类别。
引用:
最基本的整体角色属性是一般类别, 这是Unicode字符的基本分类:字母, 标点符号,符号,标记,数字,分隔符和其他。
如果您尝试使用S
的示例,并且标记为on,则它将匹配。
我的猜测是P
未在标点符号下列为任意(但在语义上合适)选择,即字面上标点符号!=符号。
答案 1 :(得分:4)
javadoc说明// p {punc}下的内容,但需要注意 POSIX字符类(仅限US-ASCII)
如果你看一下unicode中的标点字符,就没有+或$。在http://www.fileformat.info/info/unicode/category/Po/list.htm处查看unicode中的标点字符。