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 字符。这意味着它将匹配 a
和 1
但不匹配 ä
或 ١
.
您引用的段落仅在使用 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 字母(不需要标志)。
正在查看 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 字符。这意味着它将匹配 a
和 1
但不匹配 ä
或 ١
.
您引用的段落仅在使用 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 字母(不需要标志)。