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

bra*_*kim 6 javascript regex unicode

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

Unicode®标准附件#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] === "???"
Run Code Online (Sandbox Code Playgroud)

bis*_*hop 6

完整、易于使用的集成支持:否。各种匹配任务的近似值:是的。从正则表达式教程

在 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.

但即便如此,这还不够<== 阅读该链接以了解所有血腥细节。

已经提出了对文本进行分段的提案,但尚未通过。如果你专注于 Chrome,你可以使用它的非标准Intl.v8BreakIterator来打破集群并手动匹配。