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

问题描述 投票:1回答:2

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

java regex unicode posix
2个回答
2
投票

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

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

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


1
投票

您从文档中引用的文章很好但是您错过了在该表之前阅读的内容:

当指定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字母(不需要标记)。

© www.soinside.com 2019 - 2024. All rights reserved.