замените символ Юникода emoji с помощью regexp в javascript

Как вы все знаете emoji символы кодируются до 3 или 4 байт, поэтому они могут занимать 2 символа в моей строке. Например'

8 ответов


на \u.... нотация имеет четыре шестнадцатеричные цифры, не меньше, не больше, поэтому она может представлять только кодовые точки до U+FFFF. Символы юникода выше представлены в виде пар суррогатных кодовых точек.

поэтому необходим какой-то косвенный подход. Ср. к строки JavaScript вне BMP.

например, вы можете искать кодовые точки в диапазоне [\uD800-\uDBFF] (высокие суррогаты), и когда вы найдете один, проверьте, что следующая кодовая точка в строке находится в диапазон [\uDC00-\uDFFF] (если нет, есть серьезная ошибка данных), интерпретируйте их как символ Юникода и замените их тем, что вы хотите поместить туда. Это похоже на задание для простого цикла через строку, а не на регулярное выражение.


возможно, вы можете взглянуть на эту статью:http://crocodillon.com/blog/parsing-emoji-unicode-in-javascript

Юникод emoji от \u1F601 to \u1F64F

перевести на utf-16 javascript является \ud83d\ude00 to \ud83d\ude4f

первый символ всегда \ud83d.

Итак, reg вышел:

/\ud83d[\ude00-\ude4f]/g

надеюсь, это может помочь


Это несколько старый, но я рассматривал эту проблему и, кажется, Брэдли Momberger будет решение это здесь: http://airhadoken.github.io/2015/04/22/javascript-string-handling-emoji.html

регулярное выражение, которое он предлагает:

/[\uD800-\uDFFF]./ // This matches emoji

это регулярное выражение соответствует головному суррогату, который используется emojis, и charracter, следующий за головным суррогатом (который, как предполагается, является хвостовым суррогатом). Таким образом, все emojis должно быть сопоставлено правильно и с

.replace(/[\uD800-\uDFFF]./g,'')

вы должны иметь возможность удалить все emojis.

Edit: лучшее регулярное выражение найдено. Вышеуказанное регулярное выражение пропускает некоторые смайлики.

но есть сообщение reddit с версией, для которой я не могу найти emoji, который исключен из правила. На реддите здесь: https://www.reddit.com/r/tasker/comments/4vhf2f/how_to_regex_emojis_in_tasker_for_search_match_or/ И регулярное выражение есть:

/[\uD83C-\uDBFF\uDC00-\uDFFF]+/

чтобы соответствовать всем случаям, используйте модификатор g:

/[\uD83C-\uDBFF\uDC00-\uDFFF]+/g

Вторая Правка: Как правильно указал CodeToad, не распознается вышеуказанным регулярным выражением, потому что оно находится в блоке dingbats (благодаря air_hadoken).

библиотека lodash придумала отличный блок регулярных выражений Emoji:

(?:[\u2700-\u27bf]|(?:\ud83c[\udde6-\uddff]){2}|[\ud800-\udbff][\udc00-\udfff])[\ufe0e\ufe0f]?(?:[\u0300-\u036f\ufe20-\ufe23\u20d0-\u20f0]|\ud83c[\udffb-\udfff])?(?:\u200d(?:[^\ud800-\udfff]|(?:\ud83c[\udde6-\uddff]){2}|[\ud800-\udbff][\udc00-\udfff])[\ufe0e\ufe0f]?(?:[\u0300-\u036f\ufe20-\ufe23\u20d0-\u20f0]|\ud83c[\udffb-\udfff])?)*

Кевин Скотт красиво сложил, что это regex охватывает в его Блоге. Спойлер: он включает в себя dingbats


  1. / \ ud83d [\ude00 - \ude4f] / g

не включая все смайлики, такие как:, см. http://getemoji.com/ и попробуйте regex https://regex101.com/

  1. / [\uD83C - \uDBFF\uDC00 - \uDFFF]+ / g

не включая все смайлики, как : ☕️ ☁️☄️ ☀️☃️ ️ ❄️ ☹️☺️™️ ©️ ®️ 〰️

  1. даже это выражение не позволяет удалить все смайлики... :

https://github.com/nizaroni/emoji-strip/blob/master/dist/emoji-strip.js#L79

тогда, можете ли вы сказать, почему вы думаете, что эти регулярные выражения плохо удалить все экзотические символы и смайлики ?

/[\u1000-\uFFFF]+/g

ниже шаблона regex работал для меня в java.

"[\ud83c\udc00-\ud83c\udfff]|[\ud83d\udc00-\ud83d\udfff]|[\u2600-\u27ff]"

поскольку строка java использует кодировку UTF-16, а также emoji выше 0xFFFF, этот шаблон regex рассматривает суррогатные пары для идентификации смайликов.


чтобы удалить все возможные emojis:

new RegExp('[\u1000-\uFFFF]+', 'g');

может быть, вы должны использовать replace таким образом?

reg = str.replace(new RegExp('','g'),'');

попробуйте https://github.com/iLeonidze/emoji.js


emoji в диапазоне от U+1F600 до U+1F64F

вы можете использовать эту строку в своем скрипте для отправки с Json:

text.replace(/[\u1F60-\u1F64]|[\u2702-\u27B0]|[\u1F68-\u1F6C]|[\u1F30-\u1F70]{\u2600-\u26ff]/g, "");