是否存在与单个字素簇匹配的正则表达式?

时间:2018-11-07 21:52:52

标签: javascript regex unicode

字素是文本中用户可感知的字符,用unicode可能包含几个代码点。

来自Unicode® Standard Annex #29

  

重要的是要认识到用户所认为的   “字符”(一种语言的书写系统的基本单元)可能不是   只是一个Unicode代码点。相反,可以制造该基本单元   多个Unicode代码点。为了避免与   计算机使用术语“字符”,这称为用户感知的   字符。例如,“ G” +重音是用户感知的   字符:用户将其视为单个字符,但实际上   由两个Unicode代码点表示。这些用户认为   字符由所谓的字素簇近似,   可以通过编程确定。

是否可以使用正则表达式(在javascript中)来匹配单个字素簇?例如

"한bar".match(/*?*/)[0] === "한"
"நிbaz".match(/*?*/)[0] === "நி"
"aa".match(/*?*/)[0] === "a"
"\r\n".match(/*?*/)[0] === "\r\n"
"‍♂️foo".match(/*?*/)[0] === "‍♂️"

1 个答案:

答案 0 :(得分:2)

全面,易于使用的集成支持:否。各种匹配任务的近似值:是。来自regex tutorial

  

在Perl,PCRE,PHP,Boost,Ruby 2.0,Java 9和Just Great Software应用程序中,匹配单个字形(无论是作为单个代码点编码,还是使用组合标记编码为多个代码点)都很容易:只需使用\ X。您可以将\ X视为点的Unicode版本。但是,有一个区别:\ X总是匹配换行符,而点不匹配换行符,除非您启用了点匹配换行符匹配模式。

     

在.NET,Java 8和更低版本以及Ruby 1.9中,您可以使用\ P {M} \ p {M} +或(?> \ P {M} \ p {M} )作为合理的替代品。要匹配任意数量的字素,请使用(?> \ P {M} \ p {M} *)+代替\ X +。

\X是最近的,并且在ES6的任何版本中都不存在。 \P{M}\p{M}+近似于\X,但不以这种形式存在:如果通过本机或转译获得ES6,则可以使用/(\P{Mark})(\p{Mark}+)/gu

that isn't sufficient仍然如此。 <==阅读该链接以获取所有血腥细节。

A proposal to segment text已被提出,但尚未被采纳。如果您专用于Chrome,则可以使用其非标准的Intl.v8BreakIterator来破坏群集并手动进行匹配。

相关问题