我有一个问题,匹配一些标点符号时,模式。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中的标点符号。