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

Posted

技术标签:

【中文标题】在 RegEx 中,表达式 \\X 匹配啥?【英文标题】: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代码点?

【问题讨论】:

【参考方案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 始终至少匹配一个字符。然后决定是否 根据以下规则添加附加字符 结束一个集群:

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

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

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

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

    不要在前置字符后结束。

    否则,结束集群。

【讨论】:

以上是关于在 RegEx 中,表达式 \X 匹配啥?的主要内容,如果未能解决你的问题,请参考以下文章

var regex = /^[\d\,\.]*$/;这个正则是啥含义

使用 Boost::regex 进行正则表达式组匹配

正则表达式 regex

java 中正则表达式是啥意思???(regular Expression)。

正则表达式/()$/是啥意思啊

java正则表达式 String regex="[\\s\\d\\pPunct]+"这个表达式啥意思