看着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吗?还是这是文档或实施中的错误?
答案 0 :(得分:2)
默认情况下,\p{Alnum}
被视为POSIX字符类,这意味着它将仅与ASCII字符匹配。这意味着它将匹配a
和1
,但不匹配ä
或١
。
您引用的段落仅在使用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字母(否标志是必需的。)