java - Java RegEx模式中Alnum和IsAlphabetic字符类的关系
问题描述
查看 java.util.regex.Pattern的Javadoc
\p{Alnum}
一个字母数字字符:[\p{IsAlphabetic}\p{IsDigit}]
似乎每个匹配的字符也\p{IsAlphabetic}
应该匹配\p{Alnum}
但是,当角色有口音时,情况似乎并非如此。例如,以下断言失败:
assertEquals("é".matches("\\p{IsAlphabetic}+"),"é".matches("\\p{Alnum}+"));
其他带有重音符号的字符也会发生同样的情况,例如ą
, ó
, ł
, ź
ż
。所有匹配\p{IsAlphabetic}+
但不匹配\p{Alnum}+
我是否误解了 Javadoc?或者这是文档或实现中的错误?
解决方案
默认情况下\p{Alnum}
被视为 POSIX 字符类,这意味着它只会匹配 ASCII 字符。这意味着它将匹配a
and1
但不匹配ä
or ١
。
您引用的段落仅在使用UNICODE_CHARACTER_CLASS
标志时适用。
稍微过分简化,这个标志会将“旧”POSIX 样式字符类转换为它们等效的 Unicode 字符类。
推荐阅读
- c# - 如何在 C# 中使用 DataGridView 值作为保存和加载控件?
- flutter - Flutter - Firebase 电子邮件格式错误,为空
- bluetooth-lowenergy - iBeacon 名称未显示在 ESP32 BLE 扫描仪中
- swift - 将 ARFaceGeometry 保存到 OBJ 文件
- vue.js - 找不到Vue js路由404和资产
- laravel - Laravel 说在表单中给出动作时缺少必需的参数
- r - 如何以一定次数重复堆叠同一行
- google-apps-script - 如何在谷歌电子表格中 B 列的每个填充单元格中获取文本
- nginx - Apache Zeppelin websockets 是否经过身份验证?
- python - Tensorflow 的 name_scope 在 Tensorboard 中不起作用