在RegEx中,表达式\ X匹配什么?

fed*_*o-t 9 regex unicode

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

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

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

unw*_*ind 8

该网站的描述非常好:

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

因此,使其具有Unicode感知的是,当它们组合成单个可见的"事物"(字形)时,它可以匹配多个代码点.

有关更多详细信息,请参阅维基百科关于组合字符的页面,它列出了上面提到的U + 0300代码点.


Qta*_*tax 7

来自Perl 正则表达式手册

这与 Unicode扩展字素簇匹配。

\X与正常(非 Unicode 程序员)使用所认为的单个字符非常匹配。例如,考虑带有某种变音符号的 G,例如箭头。Unicode 中没有这样的单个字符,但可以通过使用 G 后跟 Unicode“COMBINING UPWARDS ARROW BELOW”来组成一个字符,并且可以由支持 Unicode 的软件将其显示为单个字符。

助记符:扩展的 Unicode 字符。

摘自PCRE 手册页(2012):

PCRE 实现了比 Perl 更简单的 \X 版本,它进行了更改以使 \X 匹配 Unicode 所称的“扩展字素簇”。这比 PCRE 匹配的扩展 Unicode 序列更复杂。

[...]

\X 扩展的 Unicode 序列

[...]

\X 转义符匹配形成扩展 Unicode 序列的任意数量的 Unicode 字符。\X 相当于

(?>\PM\pM*)
Run Code Online (Sandbox Code Playgroud)

也就是说,它匹配不带“mark”属性的字符,后跟零个或多个具有“mark”属性的字符,并将该序列视为原子组(见下文)。具有“mark”属性的字符通常是影响前一个字符的重音符号。它们的代码点都不小于 256,因此在 8 位非 UTF-8 模式下 \X 匹配任何一个字符。

请注意,Perl 的最新版本已更改 \X 以匹配 Unicode 所谓的“扩展字素簇”,它具有更复杂的定义。

PCRE 手册页的最新版本(2015):

扩展字素簇

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

(?>\PM\pM*)
Run Code Online (Sandbox Code Playgroud)

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

这个简单的定义在 Unicode 中得到了扩展,通过为每个字符提供一个字素破坏属性,并创建使用这些属性来定义扩展字素簇边界的规则,可以包含更复杂的复合字符类型。在高于 8.31 的 PCRE 版本中,\X匹配这些集群之一。

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

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

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

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

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

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

  6. 否则,结束集群。