Как разделить смайлики, содержащие флаги, без разбиения флага на 2 символа в Google Sheets

Это моя начальная строка: ????????????????

Я использовал не очень элегантный способ разбить смайлики.

=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: вот как это выглядит

????  | ???? |  ???? |     ????

Я оставил трубы, чтобы обозначить отдельный столбец

Я хочу вот что:

???????? | ???? | ???? 

person Ray Man    schedule 30.08.2016    source источник
comment
Это проблема в синтаксисе регулярных выражений JS ES5. Вместо . вам нужно использовать (?:[\0-\t\x0B\f\x0E-\u2027\u202A-\uD7FF\uE000-\uFFFF]|[\uD800-\uDBFF][\uDC00-\uDFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF]). Кроме того, вы не можете использовать (.+?) в конце шаблона, он ничему не будет соответствовать.   -  person Wiktor Stribiżew    schedule 30.08.2016
comment
@WiktorStribiżew: На самом деле проблема связана с реализацией RE2 в Google Sheets, но решение требует использования JavaScript.   -  person Rubén    schedule 30.08.2016


Ответы (1)


Краткий ответ

Чтобы правильно разделить три смайлика, нам нужно использовать пользовательскую функцию. К счастью, для этого можно использовать библиотеки JavaScript, например ту, что размещена в ответ от Орлина Гиоргиева для Получить количество символов графемы в строках javascript?

Объяснение

Формула OP возвращает четыре элемента вместо трех, потому что для встроенных функций Google Sheets требуется четыре символа (на самом деле это кодовые точки), для представления которых требуется более 4 шестнадцатеричных цифр. Каждый набор символов для представления смайликов называется астральными кодовыми точками.

Из https://mathiasbynens.be/notes/javascript-unicode

Астральные кодовые точки довольно легко распознать: если вам нужно более 4 шестнадцатеричных цифр для представления кодовой точки, это астральная кодовая точка.


Внутри JavaScript [а также встроенные функции Google Таблиц] представляет астральные символы как суррогатные пары и отображает отдельные суррогатные половинки как отдельные "символы". Если вы представляете символы, используя только escape-последовательности, совместимые с ECMAScript 5, вы увидите, что для каждого астрального символа необходимы два escape-последовательности. Это сбивает с толку, потому что люди обычно думают с точки зрения символов Unicode или графем.

Пользовательская функция

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

ПРИМЕЧАНИЕ. Не забудьте включить упомянутую библиотеку JavaScript.

Синтаксис

Предположим, что A1 содержит смайлики. Чтобы разделить три смайлика в массиве 1 x 3, используйте следующую формулу:

=TRANSPOSE(SPLITGRAPHEMES(A1))

Примечание. В Windows смайлики (????????????????) в этом вопросе и ответе выглядят не так, как в Chrome OS, поэтому в приведенном выше абзаце использовалось изображение.

person Rubén    schedule 30.08.2016