【问题标题】:Relationship between Alnum and IsAlphabetic character classes in Java RegEx patternsJava RegEx模式中Alnum和IsAlphabetic字符类的关系
【发布时间】:2019-09-08 13:19:51
【问题描述】:

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

【问题讨论】:

  • \p{Alnum} 仅匹配 ASCII 字母和数字。使用Pattern.UNICODE_CHARACTER_CLASS 选项使其完全支持Unicode。
  • @WiktorStribiżew 成功了。非常感谢!
  • 如果您阅读您引用的文档页面,您将看到 \p{Alnum} = [\p{Alpha}\p{Digit}]\p{Alpha} = [\p{Lower}\p{Upper}]\p{Lower} = [a-z]\p{Upper} = @ 987654343@

标签: java regex unicode posix


【解决方案1】:

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

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

有点过于简单了,这个标志会将“旧”POSIX 样式字符类转换为等效的 Unicode 字符类。

【讨论】:

  • 它实际上就在文档中,但它的措辞方式,我在第一次阅读时没有得到它。干杯!
【解决方案2】:

您对文档的引用很好但是您错过了阅读该表之前的行:

以下预定义字符类POSIX字符类符合Unicode Regular Expression附录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 字母(不需要标志)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多