首页 > 解决方案 > 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?或者这是文档或实现中的错误?

标签: javaregexunicodeposix

解决方案


默认情况下\p{Alnum}被视为 POSIX 字符类,这意味着它只会匹配 ASCII 字符。这意味着它将匹配aand1但不匹配äor ١

您引用的段落仅在使用UNICODE_CHARACTER_CLASS标志时适用。

稍微过分简化,这个标志会将“旧”POSIX 样式字符类转换为它们等效的 Unicode 字符类。


推荐阅读