在 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\,\.]*$/;这个正则是啥含义