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

9

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

这是如何从字符串中删除表情符号的后续问题。

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

显然的Unicode块覆盖了大多数但并非全部这些表情符号:

维基百科提供了一个编译列表,其中包含在OS X Mountain Lion和iOS 6上可用的所有符号(Apple彩色Emoji),这看起来是一个很好的起点:(稍作更新)

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块完全被覆盖,则可以。
(如果我没有得到任何答案,我将自己回答,但也许有一个简单的解决方案)

1
等等?这是否意味着,理论上(如果字体有相应的字形),我可以仅使用 ISO 3166-1 ALPHA-2 代码构建任何国旗?比如,对于德国(ISO 3166-1 ALPHA-2 代码:de),使用区域指示符号字母 D / 区域指示符号字母 E。 - Jörg W Mittag
2
@JörgWMittag 这取决于,来自http://www.unicode.org/charts/PDF/U1F100.pdf:“这些字符可以成对使用以表示区域代码。在某些表情符号实现中,某些配对可能会被识别并通过替代方式显示;例如,实现可能会识别F + R并使用代表法国国旗的符号显示此组合。” - Stefan
我可以问一下第二个是两个Unicode值吗:U+1F1EF U+1F1F5(区域指示符号字母J / 区域指示符号字母P),这不是两个符号吗(在我的电脑上看起来是这样的)? - Mike H-R
显然这可能是错误的,因为我的计算机似乎无法正确地呈现其中一些内容,如果是这样,请指出并我会删除该评论。 :) - Mike H-R
此外,通过阅读这个FAQ,以及查看这里,似乎苹果正在使用非标准变体,这可能会让您感到更困难。 (U+1F1F5代码点不是标准化变体)。 - Mike H-R
显示剩余5条评论
2个回答

4
即将发布的Unicode表情符号数据文件将有所帮助。目前这些仍然是草案,但它们可能仍然会对您有所帮助。
通过解析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

emoji-data.txt 的链接已损坏。 - franklsf95
@franklsf95 它已经迁移到http://www.unicode.org/Public/emoji/1.0/emoji-data.txt。帖子已更新。 - Mathias Bynens
喜欢那个包! - Lizozom

3

这个正则表达式匹配来自网络上可用的Emoji unicode字符,共845个:

[\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://dev59.com/iGAf5IYBdhLWcg3wbCJ3#29115920

编辑:我更新了正则表达式,排除了ASCII数字和符号。有关详细信息,请参阅如何从字符串中删除表情符号的评论。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接