javascript unicode表情符号正则表达式

时间:2017-04-05 22:06:51

标签: javascript regex unicode

我想用图标替换字符串中的所有表情符号现在我已成功将{:) :D :P :3 <3 XP .... etc}替换为图标,因此如果用户在字符串上写:),它将替换为图标,但我遇到了问题,如果用户粘贴指向等于:)的unicode,以便我需要它

如何将unicode图标更改为javascript正则表达式,如\ud800-\udbff我有很多表情符号,所以我想要转换它们的想法,转换它们之后我想用正则表达式匹配它们

前:我们 将那些表情符号改为

\uD83D\uDE01|\uD83D\uDE4F|我不知道如何改变它们所以我需要知道如何将任何表情符号改为那些角色

5 个答案:

答案 0 :(得分:16)

在ECMAScript 6中,您应该能够以相当简单的方式检测它。我编译了一个包含不同Unicode块的简单正则表达式:

正则表达式:

/[\u{1f300}-\u{1f5ff}\u{1f900}-\u{1f9ff}\u{1f600}-\u{1f64f}\u{1f680}-\u{1f6ff}\u{2600}-\u{26ff}\u{2700}-\u{27bf}\u{1f1e6}-\u{1f1ff}\u{1f191}-\u{1f251}\u{1f004}\u{1f0cf}\u{1f170}-\u{1f171}\u{1f17e}-\u{1f17f}\u{1f18e}\u{3030}\u{2b50}\u{2b55}\u{2934}-\u{2935}\u{2b05}-\u{2b07}\u{2b1b}-\u{2b1c}\u{3297}\u{3299}\u{303d}\u{00a9}\u{00ae}\u{2122}\u{23f3}\u{24c2}\u{23e9}-\u{23ef}\u{25b6}\u{23f8}-\u{23fa}]/ug

游乐场: play around with emoji and regex

这个答案并没有直接回答这个问题,但对如何使用Unicode块和ES6处理表情符号提供了公平的见解。

答案 1 :(得分:4)

注意 - 以下正则表达式将匹配代理对(补充),
以及单身(基本)。

要查看匹配的十六进制版本:
如果匹配的长度是2,则字符1是低代理,
角色2是一个高代理人。只需格式化每个字符
到十六进制,并将它们连接成一个字符串。

您可以尝试通过十六进制范围匹配一些表情符号。

这个正则表达式与这些1,114个表情符号相匹配。

注意 - 这不包括\ x00- \ x7f中范围内的字符 由于某种原因,在这个范围内有表情符号,如0-9 ..
(使用\p{Emoji=yes}

此外,您可以获得所需的表情符号字符,然后粘贴它们 进入 UCD界面下的此应用http://www.regexformat.com Unique页面,删除或添加所需的表情符号字符,然后获取十六进制utf-16
转换正则表达式。

这是一个方便的工具,您可以随时使用任何Unicode来创建自己的正则表达式。

例如,您可以使用UCD属性页来选择/搜索任何Unicode 9 属性,组合或不组合,然后获得您需要的编码点和转换。

无论如何,下面的正则表达式将匹配这些表情符号。

©®‼⁉™ℹ↔↕↖↗↘↙↩↪⌚⌛⌨⏏⏩⏪⏫⏬⏭⏮⏯⏰⏱⏲⏳⏸⏹⏺Ⓜ▪▫▶◀◻◼◽◾☀☁☂☃☄☎☑☔☕☘☝☠☢☣☦☪☮☯☸
☹☺♀♂♈♉♊♋♌♍♎♏♐♑♒♓♠♣♥♦♨♻♿⚒⚓⚔⚕⚖⚗⚙⚛⚜⚠⚡⚪⚫⚰⚱⚽⚾⛄⛅⛈⛎⛏⛑⛓⛔⛩⛪⛰⛱⛲⛳⛴⛵⛷⛸⛹⛺
⛽✂✅✈✉✊✋✌✍✏✒✔✖✝✡✨✳✴❄❇❌❎❓❔❕❗❣❤➕➖➗➡➰➿⤴⤵⬅⬆⬇⬛⬜⭐⭕〰〽㊗㊙
















正则表达式

(?:[\u00A9\u00AE\u203C\u2049\u2122\u2139\u2194-\u2199\u21A9-\u21AA\u231A-\u231B\u2328\u23CF\u23E9-\u23F3\u23F8-\u23FA\u24C2\u25AA-\u25AB\u25B6\u25C0\u25FB-\u25FE\u2600-\u2604\u260E\u2611\u2614-\u2615\u2618\u261D\u2620\u2622-\u2623\u2626\u262A\u262E-\u262F\u2638-\u263A\u2640\u2642\u2648-\u2653\u2660\u2663\u2665-\u2666\u2668\u267B\u267F\u2692-\u2697\u2699\u269B-\u269C\u26A0-\u26A1\u26AA-\u26AB\u26B0-\u26B1\u26BD-\u26BE\u26C4-\u26C5\u26C8\u26CE-\u26CF\u26D1\u26D3-\u26D4\u26E9-\u26EA\u26F0-\u26F5\u26F7-\u26FA\u26FD\u2702\u2705\u2708-\u270D\u270F\u2712\u2714\u2716\u271D\u2721\u2728\u2733-\u2734\u2744\u2747\u274C\u274E\u2753-\u2755\u2757\u2763-\u2764\u2795-\u2797\u27A1\u27B0\u27BF\u2934-\u2935\u2B05-\u2B07\u2B1B-\u2B1C\u2B50\u2B55\u3030\u303D\u3297\u3299]|(?:\uD83C[\uDC04\uDCCF\uDD70-\uDD71\uDD7E-\uDD7F\uDD8E\uDD91-\uDD9A\uDDE6-\uDDFF\uDE01-\uDE02\uDE1A\uDE2F\uDE32-\uDE3A\uDE50-\uDE51\uDF00-\uDF21\uDF24-\uDF93\uDF96-\uDF97\uDF99-\uDF9B\uDF9E-\uDFF0\uDFF3-\uDFF5\uDFF7-\uDFFF]|\uD83D[\uDC00-\uDCFD\uDCFF-\uDD3D\uDD49-\uDD4E\uDD50-\uDD67\uDD6F-\uDD70\uDD73-\uDD7A\uDD87\uDD8A-\uDD8D\uDD90\uDD95-\uDD96\uDDA4-\uDDA5\uDDA8\uDDB1-\uDDB2\uDDBC\uDDC2-\uDDC4\uDDD1-\uDDD3\uDDDC-\uDDDE\uDDE1\uDDE3\uDDE8\uDDEF\uDDF3\uDDFA-\uDE4F\uDE80-\uDEC5\uDECB-\uDED2\uDEE0-\uDEE5\uDEE9\uDEEB-\uDEEC\uDEF0\uDEF3-\uDEF6]|\uD83E[\uDD10-\uDD1E\uDD20-\uDD27\uDD30\uDD33-\uDD3A\uDD3C-\uDD3E\uDD40-\uDD45\uDD47-\uDD4B\uDD50-\uDD5E\uDD80-\uDD91\uDDC0]))  

扩展

 (?:
      [\u00A9\u00AE\u203C\u2049\u2122\u2139\u2194-\u2199\u21A9-\u21AA\u231A-\u231B\u2328\u23CF\u23E9-\u23F3\u23F8-\u23FA\u24C2\u25AA-\u25AB\u25B6\u25C0\u25FB-\u25FE\u2600-\u2604\u260E\u2611\u2614-\u2615\u2618\u261D\u2620\u2622-\u2623\u2626\u262A\u262E-\u262F\u2638-\u263A\u2640\u2642\u2648-\u2653\u2660\u2663\u2665-\u2666\u2668\u267B\u267F\u2692-\u2697\u2699\u269B-\u269C\u26A0-\u26A1\u26AA-\u26AB\u26B0-\u26B1\u26BD-\u26BE\u26C4-\u26C5\u26C8\u26CE-\u26CF\u26D1\u26D3-\u26D4\u26E9-\u26EA\u26F0-\u26F5\u26F7-\u26FA\u26FD\u2702\u2705\u2708-\u270D\u270F\u2712\u2714\u2716\u271D\u2721\u2728\u2733-\u2734\u2744\u2747\u274C\u274E\u2753-\u2755\u2757\u2763-\u2764\u2795-\u2797\u27A1\u27B0\u27BF\u2934-\u2935\u2B05-\u2B07\u2B1B-\u2B1C\u2B50\u2B55\u3030\u303D\u3297\u3299] 
   |  
      (?:
           \uD83C [\uDC04\uDCCF\uDD70-\uDD71\uDD7E-\uDD7F\uDD8E\uDD91-\uDD9A\uDDE6-\uDDFF\uDE01-\uDE02\uDE1A\uDE2F\uDE32-\uDE3A\uDE50-\uDE51\uDF00-\uDF21\uDF24-\uDF93\uDF96-\uDF97\uDF99-\uDF9B\uDF9E-\uDFF0\uDFF3-\uDFF5\uDFF7-\uDFFF] 
        |  \uD83D [\uDC00-\uDCFD\uDCFF-\uDD3D\uDD49-\uDD4E\uDD50-\uDD67\uDD6F-\uDD70\uDD73-\uDD7A\uDD87\uDD8A-\uDD8D\uDD90\uDD95-\uDD96\uDDA4-\uDDA5\uDDA8\uDDB1-\uDDB2\uDDBC\uDDC2-\uDDC4\uDDD1-\uDDD3\uDDDC-\uDDDE\uDDE1\uDDE3\uDDE8\uDDEF\uDDF3\uDDFA-\uDE4F\uDE80-\uDEC5\uDECB-\uDED2\uDEE0-\uDEE5\uDEE9\uDEEB-\uDEEC\uDEF0\uDEF3-\uDEF6] 
        |  \uD83E [\uDD10-\uDD1E\uDD20-\uDD27\uDD30\uDD33-\uDD3A\uDD3C-\uDD3E\uDD40-\uDD45\uDD47-\uDD4B\uDD50-\uDD5E\uDD80-\uDD91\uDDC0] 
      )
 )

答案 2 :(得分:1)

我认为您也可以使用 Unicode 字符属性。甚至 Unicode 联盟本身 provide a regex 也可以相对容易地针对 ECMAScript 进行调整(通过将所有出现的 \x 替换为 \u 并将其全部放在一行中)。不过它确实选择了可能的表情符号,这意味着它会产生误报。明确建议在假设它们实际上是表情符号之前仍然验证所有匹配项。

这是该正则表达式的一个更严格的版本,它会返回更少的误报,并带有一个迷你演示:

const sentence = 'A ticket to 大阪 costs ¥2000 ?. Repeated emojis: ??. Crying cat: ?. Repeated emoji with skin tones: ✊?✊?✊?✊✊✊?. Flags: ?????????. Scales ⚖️⚖️⚖️.';

const regexpUnicodeModified = /\p{RI}\p{RI}|\p{Emoji}(\p{EMod}+|\u{FE0F}\u{20E3}?|[\u{E0020}-\u{E007E}]+\u{E007F})?(\u{200D}\p{Emoji}(\p{EMod}+|\u{FE0F}\u{20E3}?|[\u{E0020}-\u{E007E}]+\u{E007F})?)+|\p{EPres}(\p{EMod}+|\u{FE0F}\u{20E3}?|[\u{E0020}-\u{E007E}]+\u{E007F})?|\p{Emoji}(\p{EMod}+|\u{FE0F}\u{20E3}?|[\u{E0020}-\u{E007E}]+\u{E007F})/gu
console.log(sentence.match(regexpUnicodeModified));

这将记录以下内容:

> Array ["?", "?", "?", "?", "✊?", "✊?", "✊?", "✊", "✊", "✊?", "??", "???????", "⚖️", "⚖️", "⚖️"]

表示匹配:

  • 简单的表情符号
  • 带有修饰符的表情符号(肤色)
  • 国家标志
  • 区域标志
  • 表情符号呈现序列

请注意,我不知道如何像 OP 那样使用图像替换特定的表情符号,但它确实可以将表情符号放置在额外的标签等中。

答案 3 :(得分:0)

您可以使用以下功能更改为 \ U 个字符。

var emojiToUnicode=function (message){
    var emojiRegexp = /([\uE000-\uF8FF]|\uD83C[\uDC00-\uDFFF]|\uD83D[\uDC00-\uDFFF]|[\u2694-\u2697]|\uD83E[\uDD10-\uDD5D])/g;
    if(!message)
        return;
    try{ 
        var newMessage = message.match(emojiRegexp);
        for(var emoj in newMessage){
              var emojmessage = newMessage[emoj];
              var index = message.indexOf(emojmessage);
              if(index === -1)
                  continue;
              emojmessage = "\\u" + emojmessage.charCodeAt(0).toString(16) + "\\u" + emojmessage.charCodeAt(1).toString(16);
              message = message.substr(0, index) + emojmessage + message.substr(index + 2);
            }
        return message;
    }catch(err){
        console.error("error in emojiToUnicode"+err.stack);
    }
 };

答案 4 :(得分:0)

这些模式中有许多确实与许多表情符号“字母”匹配,但与复合修饰符序列的匹配不正确(全部作为一组)。匹配将比实际表情符号更多。

例如:

"??‍❤️‍?‍?".split('').map(function(chr) { return '\\u' + chr.charCodeAt(0).toString(16); }).join('')
/*\ud83d\udc68\ud83c\udffb\u200d\u2764\ufe0f\u200d\ud83d\udc8b\u200d\ud83d\udc68\ud83c\udffb*/

此单个表情符号是另外4个与U + 200D零宽度连接器一起使用的表情符号:

?+ U + 200D + ❤️‍ + U + 200D + ?‍ + U + 200D +?

因此,您希望您的模式首先匹配较长的序列,或者在匹配序列之前先匹配那些“内部表情符号”,如下所示:

(?:\ud83e\uddd1\ud83c\udffb\u200d\u2764\ufe0f\u200d\ud83d\udc8b\u200d\ud83e\uddd1\ud83c\udffc|...Every Other Sequence, Longest First...|\u25ab)

模式是一个简单的交替,并且运行速度很快。

GitHub:https://github.com/sweaver2112/Regex-combined-emojis

Regex 101 Demo

该模式匹配3240次,这是正确的。它包括来自的所有字符 * https://unicode.org/emoji/charts/full-emoji-list.html和 * {https://unicode.org/emoji/charts-13.1/full-emoji-modifiers.html