问题描述
注意:此问题在不支持随附表情符号的系统上可能看起来很奇怪。
这是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