[英]Is there a regular expression which matches a single grapheme cluster?
字素是文本的用戶感知字符,其在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] === "💆♂️"
完整,易用的集成支持:沒有。 各種匹配任務的近似值:是的。 從正則表達式教程 :
匹配單個字形,無論是編碼為單個代碼點,還是使用組合標記作為多個代碼點,在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
來中斷群集並手動匹配。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.