看着Javadoc for java.util.regex.Pattern
\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
和1
但不匹配ä
或١
。
您引用的段落仅适用于使用UNICODE_CHARACTER_CLASS
标志时。
略微过度简化,此标志将“旧”POSIX样式字符类转换为其等效的Unicode字符类。
您从文档中引用的文章很好但是您错过了在该表之前阅读的内容:
当指定Unicode Regular Expression标志时,以下预定义字符类和POSIX字符类符合附件C的建议:
UNICODE_CHARACTER_CLASS
的兼容性属性。
如果你阅读了你引用的文档页面,你会看到\p{Alnum}
= [\p{Alpha}\p{Digit}]
和\p{Alpha}
= [\p{Lower}\p{Upper}]
和\p{Lower}
= [a-z]
和\p{Upper}
= [A-Z]
。
因此,当\p{Alnum}
标志未设置时,UNICODE_CHARACTER_CLASS
仅匹配ASCII字母(和数字),而\p{L}
(= \p{IsAlphabetic}
)默认匹配所有Unicode字母(不需要标记)。