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

时间:2019-04-18 08:28:55

标签: java regex unicode posix

看着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吗?还是这是文档或实施中的错误?

2 个答案:

答案 0 :(得分:2)

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

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

略微简化,此标志会将“旧的” POSIX样式字符类转换为等效的Unicode字符类。

答案 1 :(得分:1)

您从文档中引用的报价很好,但您错过了阅读该表之前的内容的行:

  

以下预定义字符类 POSIX字符类符合{{3}的附件C:兼容性属性的建议},在指定UNICODE_CHARACTER_CLASS标志时。

如果您阅读引用的文档页面,则会看到\p{Alnum} = [\p{Alpha}\p{Digit}]\p{Alpha} = [\p{Lower}\p{Upper}]\p{Lower} = {{1} }和[a-z] = \p{Upper}

因此,[A-Z]仅在未设置\p{Alnum}标志的情况下匹配ASCII字母(和数字),而UNICODE_CHARACTER_CLASS(= \p{L})默认匹配所有Unicode字母(否标志是必需的。)