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

时间:2014-07-11 10:02:48

标签: ruby regex unicode emoji

  

注意:这个问题在不支持附带表情符号的系统上看起来很奇怪。

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

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

明显的Unicode块涵盖了大多数,但不是所有这些表情符号:

维基百科提供了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+ 0023 U + FE0F U + 20E3(数字符​​号/变体选择器16 /组合封闭键帽)

(变体选择器16表示“表情符号样式”)

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

正则表达式不必尊重较大块中的“缺失”字符,即如果上面提到的4个Unicode块完全被覆盖就可以了。

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

2 个答案:

答案 0 :(得分:3)

即将到来的Unicode Emoji data files会对此有所帮助。目前这些仍然是草稿,但他们可能仍然会帮助你。

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

以下是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

答案 1 :(得分:2)

此正则表达式匹配所有845表情符号,取自Emoji unicode characters for use on the web

[\u{203C}\u{2049}\u{20E3}\u{2122}\u{2139}\u{2194}-\u{2199}\u{21A9}-\u{21AA}\u{231A}-\u{231B}\u{23E9}-\u{23EC}\u{23F0}\u{23F3}\u{24C2}\u{25AA}-\u{25AB}\u{25B6}\u{25C0}\u{25FB}-\u{25FE}\u{2600}-\u{2601}\u{260E}\u{2611}\u{2614}-\u{2615}\u{261D}\u{263A}\u{2648}-\u{2653}\u{2660}\u{2663}\u{2665}-\u{2666}\u{2668}\u{267B}\u{267F}\u{2693}\u{26A0}-\u{26A1}\u{26AA}-\u{26AB}\u{26BD}-\u{26BE}\u{26C4}-\u{26C5}\u{26CE}\u{26D4}\u{26EA}\u{26F2}-\u{26F3}\u{26F5}\u{26FA}\u{26FD}\u{2702}\u{2705}\u{2708}-\u{270C}\u{270F}\u{2712}\u{2714}\u{2716}\u{2728}\u{2733}-\u{2734}\u{2744}\u{2747}\u{274C}\u{274E}\u{2753}-\u{2755}\u{2757}\u{2764}\u{2795}-\u{2797}\u{27A1}\u{27B0}\u{2934}-\u{2935}\u{2B05}-\u{2B07}\u{2B1B}-\u{2B1C}\u{2B50}\u{2B55}\u{3030}\u{303D}\u{3297}\u{3299}\u{1F004}\u{1F0CF}\u{1F170}-\u{1F171}\u{1F17E}-\u{1F17F}\u{1F18E}\u{1F191}-\u{1F19A}\u{1F1E7}-\u{1F1EC}\u{1F1EE}-\u{1F1F0}\u{1F1F3}\u{1F1F5}\u{1F1F7}-\u{1F1FA}\u{1F201}-\u{1F202}\u{1F21A}\u{1F22F}\u{1F232}-\u{1F23A}\u{1F250}-\u{1F251}\u{1F300}-\u{1F320}\u{1F330}-\u{1F335}\u{1F337}-\u{1F37C}\u{1F380}-\u{1F393}\u{1F3A0}-\u{1F3C4}\u{1F3C6}-\u{1F3CA}\u{1F3E0}-\u{1F3F0}\u{1F400}-\u{1F43E}\u{1F440}\u{1F442}-\u{1F4F7}\u{1F4F9}-\u{1F4FC}\u{1F500}-\u{1F507}\u{1F509}-\u{1F53D}\u{1F550}-\u{1F567}\u{1F5FB}-\u{1F640}\u{1F645}-\u{1F64F}\u{1F680}-\u{1F68A}]

可以在此处找到示例:https://stackoverflow.com/a/29115920/1911674

编辑:我使用正则表达式来排除ASCII数字和符号。有关详细信息,请参阅How do I remove emoji from string的评论。