有些标点符号与Pattern不匹配.启用UNICODE_CHARACTER_CLASS标志



我有一个问题,匹配一些标点符号时,模式。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{punt}包含诸如!"#$%&'()*+,-./:;<=>?@[]^_`{|}~

除了'+'符号,$+<=>^ ' |~

后面的字符也会出现同样的问题

当模式。删除UNICODE_CHARACTER_CLASS,它可以正常工作

如果有任何关于这个问题的提示,我将非常感谢

来自文档:

当指定此标志时,则(仅限US-ASCII)预定义字符类和POSIX字符类是一致的Unicode技术标准#18:Unicode正则表达式附件C: Compatibility Properties.

如果您看一下UTS35 (Unicode技术标准)的一般类别属性,您将看到一般类别属性下的表中符号(S和子类别)和标点符号(P和子类别)之间的区别。

引用:

最基本的整体字符属性是一般类别,这是Unicode字符的基本分类:字母,标点、符号、标记、数字、分隔符和其他。

如果你尝试你的例子与\p{S},与标志上,它将匹配。

我的猜测是+没有作为任意(但语义上适当的)选择列在标点符号下,即字面上的标点符号!=符号。

javadoc声明//p{punc}下的内容,并警告
POSIX字符类(仅限US-ASCII)

如果你看一下unicode中的标点符号,没有+或$。在http://www.fileformat.info/info/unicode/category/Po/list.htm查看unicode中的标点符号。

最新更新