某些标点字符与Pattern.UNICODE_CHARACTER_CLASS标志启用不匹配

时间:2015-08-18 09:26:55

标签: java regex unicode pattern-matching java-8

启用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时,它可以正常工作

我将很感激有关该问题的任何提示

2 个答案:

答案 0 :(得分:4)

来自documentation

  

指定此标志时,(仅限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中的标点字符。