Java RegEx 模式中 Alnum 和 IsAlphabetic 字符 类 之间的关系

Relationship between Alnum and IsAlphabetic character classes in Java RegEx patterns

正在查看 Javadoc for java.util.regex.Pattern

\p{Alnum} An alphanumeric character:[\p{IsAlphabetic}\p{IsDigit}]

似乎每个匹配 \p{IsAlphabetic} 的字符也应该匹配 \p{Alnum}

但是,当角色有口音时,情况似乎并非如此。例如,以下断言失败:

assertEquals("é".matches("\p{IsAlphabetic}+"),"é".matches("\p{Alnum}+"));

其他带有重音符号的字符也会出现同样的情况,例如 ąółź ż。全部匹配 \p{IsAlphabetic}+ 但不匹配 \p{Alnum}+

我是否误解了 Javadoc?或者这是文档或实现中的错误?

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

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

稍微过于简单化,此标志会将 "old" POSIX 样式字符 classes 转换为等效的 Unicode 字符 classes。

您对文档的引用很好但是您没有阅读之前的那一行table:

The following Predefined Character classes and POSIX character classes are in conformance with the recommendation of Annex C: Compatibility Properties of Unicode Regular Expression, when UNICODE_CHARACTER_CLASS flag is specified.

如果您阅读了您引用的文档页面,您会看到 \p{Alnum} = [\p{Alpha}\p{Digit}] and \p{Alpha} = [\p{Lower}\p{Upper}] and \p{Lower} = [a-z]\p{Upper} = [A-Z].

因此,当 UNICODE_CHARACTER_CLASS 标志未设置时,\p{Alnum} 仅匹配 ASCII 字母(和数字),而 \p{L} (=\p{IsAlphabetic}) 默认匹配所有 Unicode 字母(不需要标志)。