Mac OS X/iOS中的正则表达式匹配表情符号

人气:65 发布:2023-01-03 标签: regex ruby unicode emoji

问题描述

注意:此问题在不支持随附表情符号的系统上可能看起来很奇怪。

这是How do I remove emoji from string的后续问题。

我要构建一个与Mac OS X/iOS中可以输入的所有表情符号匹配的正则表达式。

明显的Unicode代码块涵盖了这些表情符号的大部分,但不是全部:

U+1F300..U+1F5FFMiscellaneous Symbols And Pictographs U+1F600..U+1F64FEmoticons U+1F650..U+1F67FOrnamental Dingbats U+1F680..U+1F6FFTransport and Map Symbols

维基百科提供了all the symbols available in Apple Color Emoji on OS X Mountain Lion and iOS 6的编译列表,这看起来是一个很好的起点:(略有更新)

people  = '☺️✨✊✌✋☝❤'
nature  = '⭐☀⛅☁⚡☔❄⛄'
objects = '☎⏳⌛⏰⌚✉✂✒✏⚽⚾⛳☕'
places  = '⛪⛺⛲⛵⚓✈⚠⛽♨'
symbols = '1️⃣2️⃣3️⃣4️⃣5️⃣6️⃣7️⃣8️⃣9️⃣0️⃣#️⃣⬆️⬇️⬅️➡️↗️↖️↘️↙️↔️↕️◀️▶️↩️↪️ℹ️⏪⏩⏫⏬⤵️⤴️️♿️Ⓜ️㊙️㊗️⛔✳️❇️❎✅✴️➿♻️♈️♉️♊️♋️♌️♍️♎️♏️♐️♑️♒️♓️⛎©️®️™️❌‼️⁉️❗❓❕❔⭕✖️➕➖➗♠♥♣♦✔☑➰〰〽️◼️◻️◾️◽️▪️▫️⚫️⚪️⬜️⬛️'

emoji = people + nature + objects + places + symbols # all emoji combined

大多数字符都有一个代码点,转换这些代码点很容易:

U+1F600(笑脸)

但某些字符使用两个Unicode值编码:

☺️U+263a U+FE0F(白色笑脸,变体选择器16) U+1F1EF U+1F1F5(地区指标字母J/地区指标字母P) ⬛️U+2B1B U+FE0F(黑色大正方形/变化选择器16)

有些甚至有3个码点:

️⃣U+0023U+FE0F U+20E3(数字符号/变体选择器16/组合封闭键帽)

(变体选择器16表示表情符号样式(&Q;)

如何将此列表拆分为字符(而不拆分组合的字符),找到它们的代码点并最终构建与它们匹配的正则表达式?

正则表达式不必考虑较大块中缺少的字符,也就是说,如果完全覆盖上面提到的4个Unicode块就可以了。

(如果我得不到任何答案,我会自己回答这个问题,但也许有一个简单的解决方案)

推荐答案

即将发布的Unicode Emoji data files将对此有所帮助。目前,这些仍是草稿,但它们仍可能对您有所帮助。

通过解析http://www.unicode.org/Public/emoji/1.0/emoji-data.txt,您可以非常容易地获得Unicode标准中所有emoji的列表。(请注意,其中一些表情符号由多个代码点组成。)一旦有了这样的列表,将其转换为正则表达式就很容易了。

这是一个JavaScript版本:https://github.com/mathiasbynens/emoji-regex/blob/master/index.js,这是根据emoji-data.txt:https://github.com/mathiasbynens/emoji-regex/blob/master/scripts/generate-regex.js

生成它的脚本

17