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

标签 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 被移除时,它工作正常

我将不胜感激关于该问题的任何提示

最佳答案

来自documentation :

When this flag is specified then the (US-ASCII only) Predefined character classes and POSIX character classes are in conformance with Unicode Technical Standard #18: Unicode Regular Expression Annex C: Compatibility Properties.

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

引用:

The most basic overall character property is the General Category, which is a basic categorization of Unicode characters into: Letters, Punctuation, Symbols, Marks, Numbers, Separators, and Other.

如果您使用 \\p{S} 尝试您的示例,并打开标志,它将匹配。

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

关于java - 某些标点字符与启用的 Pattern.UNICODE_CHARACTER_CLASS 标志不匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32068513/

相关文章:

java - 如何向 Spring Boot 添加更多指标?

javascript - Vue.js - 在组件内部使用 unicode 语法渲染 Font Awesome 不起作用

java - 从数据库获取 Unicode 文本后,如何将其存储在文件中?

regex - Nodemon 使用正则表达式忽略文件夹

c# - 0,0.0 或 100.20 或 0.99 或 9999.99 的正则表达式

Android:replaceAll() 和双引号问题

javascript - 如何使用 Unicode Hexadecimal 更改 css 样式

java - 如何删除使用 addContentView 添加的 View ?

java - LinkedList.contains 执行速度

java - 使用主键进行 hibernate 一对一连接不起作用