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

时间:2012-03-29 15:25:00

标签: regex unicode

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

  

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

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

2 个答案:

答案 0 :(得分:7)

该网站的描述非常好:

  

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

因此,使其具有Unicode感知能力的是它可以匹配几个代码点,当它们组合成一个可见的“东西”(字母)时。

有关详细信息,请参阅Wikipedia's page on Combining Characters,例如,它列出了上面提到的U + 0300代码点。

答案 1 :(得分:3)

来自Perl regex manual

  

这匹配Unicode 扩展字形集群

     

\X非常匹配   以及正常(非Unicode程序员)使用会考虑的问题   单个字符。举个例子,考虑某种G   变音符号,如箭头。没有这样的单一字符   Unicode,但可以使用G后跟Unicode组成   “将箭头组合在下面”,并将显示   支持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中扩展为包含更多   通过赋予每个字符a复杂的复合字符   字形破坏属性,并创建使用这些属性的规则   用于定义扩展字形的边界的属性   集群。在早于8.31的PCRE版本中,\X匹配其中一个   这些集群。

     

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

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

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

  4.   
  5. 不要破坏韩文(朝鲜语脚本)的音节序列。韩文字符有五种类型:L,V,T,LV和LVT。安.L   字符后面可以跟一个L,V,LV或LVT字符;一个LV或   V字符后面可以跟一个V或T字符; LVT或T.   字符可能只有T字符。

  6.   
  7. 在扩展字符或间距标记之前不要结束。带有“mark”属性的字符总是具有“extend”   字形破坏属性。

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

  10.   
  11. 否则,请结束群集。

  12.