【问题标题】:What does the expression \X match when inside a RegEx?在 RegEx 中,表达式 \X 匹配什么?
【发布时间】:2012-04-13 06:49:43
【问题描述】:

根据http://www.regular-expressions.info

您可以考虑\X 是使用纯 ASCII 的正则表达式引擎中点的 Unicode 版本。

这是否意味着它将匹配任何可能的Unicode代码点?

【问题讨论】:

    标签: regex unicode


    【解决方案1】:

    网站的描述很不错:

    \X 匹配单个 Unicode 字形,无论是编码为单个代码点还是使用组合标记的多个代码点。字形最接近于“字符”的日常概念。 \X 匹配 à 编码为 U+0061 U+0300、à 编码为 U+00E0、© 等。

    因此,使它能够识别 Unicode 的原因在于,当它们组合成一个可见的“事物”(字素)时,它可以匹配 多个代码点

    更多详情请参见Wikipedia's page on Combining Characters,例如上面提到的 U+0300 代码点。

    【讨论】:

      【解决方案2】:

      来自Perl regex manual

      这匹配一个 Unicode扩展字素簇

      \X 相当匹配 那么正常的(非Unicode程序员)使用会考虑什么 单个字符。例如,考虑具有某种类型的 G 变音符号,例如箭头。没有这样的单一角色 Unicode,但可以通过使用 G 后跟 Unicode 来组合 “COMBINING UPWARDS ARROW BELOW”,将由 识别 Unicode 的软件就好像它是单个字符一样。

      助记符:扩展的 Unicode 字符。

      来自PCRE man pages(2012):

      PCRE 实现了一个比 Perl 更简单的 \X 版本,后者更改为使 \X 匹配 Unicode 所称的“扩展字形簇”。 这比扩展的 Unicode 序列更复杂,即 PCRE 匹配什么。

      [...]

      \X 一个扩展的 Unicode 序列

      [...]

      \X 转义符匹配构成扩展 Unicode 序列的任意数量的 Unicode 字符。 \X 等价于

      (?>\PM\pM*)
      

      即匹配一个没有“mark”属性的字符, 后跟零个或多个具有“mark”属性的字符,以及 将序列视为一个原子组(见下文)。字符与 “mark”属性通常是影响 前面的字符。他们都没有小于 256 的代码点,所以在 8 位非 UTF-8 模式 \X 匹配任意一个字符。

      请注意,最近的 Perl 版本已更改 \X 以匹配 Unicode 称为“扩展字形簇”,它具有更多 复杂的定义。

      PCRE man pages (2015) 的更新版本:

      扩展字素簇

      \X 转义符匹配任意数量的 Unicode 字符 一个“扩展字素簇”,并将序列视为原子 组(见下文)。直到并包括版本 8.31,PCRE 匹配 一个更早的、更简单的定义,相当于

      (?>\PM\pM*)
      

      也就是说,它匹配了一个没有“mark”属性的字符, 后跟零个或多个具有“mark”属性的字符。 具有“mark”属性的字符通常是非间距的 影响前一个字符的重音符号。

      这个简单的定义在 Unicode 中得到了扩展,包括更多 通过给每个字符一个 字形破坏属性,并创建使用这些属性的规则 定义扩展字形边界的属性 集群。在 8.31 之后的 PCRE 版本中,\X 匹配以下之一 这些集群。

      \X 始终至少匹配一个字符。然后决定是否 根据以下规则添加附加字符 结束一个集群:

      1. 在主题字符串的末尾结束。

      2. 不要在 CR 和 LF 之间结束;否则在任何控制字符之后结束。

      3. 不要破坏 Hangul(韩文)音节序列。韩文字符有五种类型:L、V、T、LV 和 LVT。安乐 字符后面可以跟一个 L、V、LV 或 LVT 字符; LV 或 V 字符后面可以跟一个 V 或 T 字符; LVT 或 T 字符后面只能跟一个 T 字符。

      4. 不要在扩展字符或间隔标记之前结束。具有“mark”属性的字符始终具有“extend” 字形破坏属性。

      5. 不要在前置字符后结束。

      6. 否则,结束集群。

      【讨论】:

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