如何拆分包含标志的表情符号而不将标记分成Google表格中的2个字符

时间:2016-08-30 06:12:35

标签: regex google-sheets formulas

这是我的初始字符串:  

我使用了一种不那么优雅的方式来打破表情符号。

=if(len(I88) = 4, REGEXEXTRACT(I88,"(.+?)\s*(.+?)"),if(len(I88) = 6, REGEXEXTRACT(I88,"(.+?)\s*(.+?)\s*(.+?)"),if(len(I88) = 8, REGEXEXTRACT(I88,"(.+?)\s*(.+?)\s*(.+?)\s*(.+?)"),if(len(I88) = 10, REGEXEXTRACT(I88,"(.+?)\s*(.+?)\s*(.+?)\s*(.+?)\s*(.+?)"), REGEXEXTRACT(I88,"\s*(.+?)" )))))

结果是4列而不是3列:这就是它的样子

  |  |   |     

我离开管道指示一个单独的列

我想要的是:

 |  |  

1 个答案:

答案 0 :(得分:1)

简短回答

要正确分隔三个表情符号,我们需要使用custom function。 Fortunaly有一些JavaScript库可用于此the oneanswer分享到Orlin GiorgievGet grapheme character count in javascript strings?

解释

OP公式返回四个元素而不是三个元素,因为Google表格内置函数需要四个“字符”(实际上它们是代码点),需要超过4个十六进制数字来表示它们。表示表情符号的每组“字符”称为“星体代码点”。

来自https://mathiasbynens.be/notes/javascript-unicode

  

Astral代码点非常容易识别:如果您需要超过4个十六进制数字来表示代码点,那么它就是一个星号代码点。

  

在内部,JavaScript [以及Google表格内置函数]将星体符号表示为surrogate pairsit exposes the separate surrogate halves as separate “characters”。如果使用ECMAScript 5兼容的转义序列表示只使用符号的符号,您将看到每个星体符号需要两个转义符。这很令人困惑,因为人们通常会考虑使用Unicode符号或字形。

自定义功能

function SPLITGRAPHEMES(string) {
  var splitter = new GraphemeSplitter();
  return splitter.splitGraphemes(string); 
}

注意:不要忘记包含referred JavaScript library

语法

假设A1包含emoticons。要在1 x 3阵列中拆分三个表情符号,请使用以下公式:

=TRANSPOSE(SPLITGRAPHEMES(A1))

注意:在Windows中,此Q& A中的表情符号()与Chrome操作系统中的表情符号不同,因此在上一段中使用了图像。