10 题: 如何从字符串中删除表情符号

在...创建的问题 Thu, Jul 10, 2014 12:00 AM

我的问题是从字符串中删除表情符号,而不是使用正则表达式从字符串中删除CJK(中文,日文,韩文)字符。我试图使用这个正则表达式:

 
REGEX = /[^\u1F600-\u1F6FF\s]/i

这个正则表达式工作正常,除了它还检测我需要这些字符的中文,日文和韩文字符。知道如何解决这个问题吗?

    
18
  1. 有很多表情符号 - 也许最好将黑名单删除?
    2014-07-10 09:26:27Z
  2. @ dax主要是iPhone和Android键盘中的那些Emojis
    2014-07-10 09:27:48Z
  3. 醇>
    10个答案                              10 跨度>                         

    Karol S已经提供了解决方案,但原因可能不明确:

    "\u1F600"实际上是"\u1F60",其次是"0"

     
    "\u1F60"    # => "ὠ"
    "\u1F600"   # => "ὠ0"
    

    对于FFFF以上的代码点,您必须使用花括号:

     
    "\u{1F600}" #=> "😀"
    

    因此,字符类[\u1F600-\u1F6FF]被解释为[\u1F60 0-\u1F6F F],即它 匹配"\u1F60",范围"0" .. "\u1F6F""F"

    使用花括号解决了这个问题:

     
    /[\u{1F600}-\u{1F6FF}]/
    

    这匹配这些unicode块中的(表情符号)字符:


    您也可以使用 unpack pack between? 以获得类似的结果。这也适用于 Ruby 1.8.7 ,它在正则表达式中不支持Unicode。

     
    s = 'Hi!😀'
    #=> "Hi!\360\237\230\200"
    
    s.unpack('U*').reject{ |e| e.between?(0x1F600, 0x1F6FF) }.pack('U*')
    #=> "Hi!" 
    

    关于您的 Rubular示例 - 表情符号是单个字符:

     
    "😀".length  #=> 1
    "😀".chars   #=> ["😀"]
    

    kaomoji 是多个角色的组合:

     
    "^_^".length #=> 3
    "^_^".chars  #=> ["^", "_", "^"]
    

    匹配这些是一项非常不同的任务(你应该在另一个问题中提出这个问题)。

        
    28
    2018-06-05 21:09:01Z
    1. 我试过你提供的正则表达式。这是链接,这是使用我在问题中提到的正则表达式链接。它不适用于你的正则表达式,我的工作正在运行,但问题就像我在问题中提到的那样。
      2014-07-11 03:19:31Z
    2. @ kilua那些不是表情符号 kaomoji
      2014-07-11 05:14:57Z
    3. @ kilua我已经更新了我的问题
      2014-07-11 06:26:36Z
    4. 你确定"^_^".length #=> 1吗?
      2014-07-11 10:45:52Z
    5. @ sawa thanks ^ _ ^
      2014-07-11 10:48:17Z
    6. 醇>

    我使用的是基于此脚本的内容。

     
     def strip_emoji(text)
        text = text.force_encoding('utf-8').encode
        clean = ""
    
        # symbols & pics
        regex = /[\u{1f300}-\u{1f5ff}]/
        clean = text.gsub regex, ""
    
        # enclosed chars 
        regex = /[\u{2500}-\u{2BEF}]/ # I changed this to exclude chinese char
        clean = clean.gsub regex, ""
    
        # emoticons
        regex = /[\u{1f600}-\u{1f64f}]/
        clean = clean.gsub regex, ""
    
        #dingbats
        regex = /[\u{2702}-\u{27b0}]/
        clean = clean.gsub regex, ""
      end
    

    结果:

     
    irb> strip_emoji("👽😀☂❤华み원❤")
    => "华み원"
    
        
    15
    2015-10-29 07:14:35Z
    1. 我用你的答案并且工作得很好,谢谢
      2016-05-07 17:02:45Z
    2. 很棒的答案..节省我的一天.. !! :)
      2016-11-10 11:31:31Z
    3. 这对我来说效果很好。我创建了一个EmojiStripper关注点,它使用before_validation回调来在执行验证之前从所有字符串字段中去除emojis。这会导致所有表情符号在保存到数据库之前被删除。
      2016-12-27 21:29:35Z
    4. 警告:此答案中的代码不会删除所有EMOJIS。它删除简单的😀emojis罚款,但它没有正确删除多个代码点emojis,例如👨👩👧👦or☸️。
      2018-10-04 17:17:24Z
    5. 醇>

    这个正则表达式匹配所有845表情符号,取自表情符号unicode字符用于网络

     
    [\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}]
    

    我直接从Unicode表情符号的原始列表生成此正则表达式。算法在这里: https://github.com/franklsf95/ruby-emoji-regex

    使用示例:

     
    regex = /[\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}]/
    str = "I am a string with emoji 😍😍😱😱👿👿🐔🌚 and other Unicode characters 比如中文."
    str.gsub regex, ''
    # "I am a string with emoji  and other Unicode characters 比如中文."
    

    保留其他Unicode字符,例如亚洲字符。

    编辑:我使用正则表达式来排除ASCII数字和符号。有关详细信息,请参阅注释。

        
    14
    2015-03-31 20:52:40Z
    1. 嗯,我把它粘贴到rubular中,发现它也匹配了数字
      2015-03-31 16:12:01Z
    2. @ rmosolgo感谢您的关注!我已经从表情符号中排除了数字和其他ASCII字符。包含数字的原因是一些表情符号的形式为8⃣(U+0038 U+20E3)。我手动删除了那些ASCII码。
      2015-03-31 20:51:30Z
    3. 醇>
     
    REGEX = /[^\u{1F600}-\u{1F6FF}\s]/
    

     
    REGEX = /[\u{1F600}-\u{1F6FF}\s]/
    REGEX = /[\u{1F600}-\u{1F6FF}]/
    REGEX = /[^\u{1F600}-\u{1F6FF}]/
    

    因为你的原始正则表达式似乎表明你试图找到所有不是amoji而不是空格的东西,我不知道你为什么要这样做。

    此外:

    • 表情符号是1F300-1F6FF而不是1F600-1F6FF;你可能想改变那个

    • 如果你想删除所有星号字符(例如你处理不支持所有Unicode的软件),你应该使用10000-10FFFF。

    编辑:你几乎肯定想要REGEX = /[\u{1F600}-\u{1F6FF}]/或类似。您的原始正则表达式匹配的不是空格,而不是范围0-\u1F6F。由于空格是空格,英文字母在0-\u1F6F范围内,而汉字不在,因此正则表达式匹配汉字并删除它们。     
    8
    2014-07-10 10:18:39Z
    1. 感谢您的回复,我已经尝试了所有正则表达式,但没有一个正常工作。这是我的链接但它有问题,我说有问题......
      2014-07-11 03:37:03Z
    2. 您的样本列表中不包含任何表情符号,它包含 kaomoji 。 Kaomoji由字母和符号混合而成,你不能用简单的正则表达式删除它们。
      2014-07-11 08:37:05Z
    3. 我的错误,现在我明白它是如何工作的...感谢您的回复
      2014-07-11 09:09:05Z
    4. 醇>

    此主题中的大多数答案都没有正确删除所有表情符号。他们删除像😀fine这样简单的表情符号。但他们不会完全删除像👨👩👧👦或☸️这样的多代码点表情符号,留下一些残留的unicode代码点。

    您可以使用像 unicode-emoji 这样的宝石来获取最新的表情符号正则表达式,但是如果您发现这种过度杀伤,则以下代码可能是一个足够好的解决方案:

     
    text.gsub(/[^[:alnum:][:blank:][:punct:]]/, '').squeeze(' ').strip
    

    这将删除任何不是基本unicode alphanum /punct /blank的表情符号或奇怪的unicody字符。

        
    3
    2018-10-04 17:30:59Z

    除了删除表情符号字符外,您只能包含字母和数字。一个简单的tr应该可以做到这一点,.tr('^A-Za-z0-9', '')。当然,这将删除所有标点符号,但您可以随时修改正则表达式以适合您的特定条件。

        
    1
    2015-08-28 06:39:45Z

    这个非常短的 Regex 涵盖 getemoji.com 到目前为止:

     
    [\u{1F300}-\u{1F5FF}|\u{1F1E6}-\u{1F1FF}|\u{2700}-\u{27BF}|\u{1F900}-\u{1F9FF}|\u{1F600}-\u{1F64F}|\u{1F680}-\u{1F6FF}|\u{2600}-\u{26FF}]
    
        
    1
    2018-01-11 04:01:25Z
    1. 使用\U(对于Python,Postgres等)使用相同的正则表达式:[\U0001F300-\U0001F5FF|\U0001F1E6-\U0001F1FF|\U00002700-\U000027BF|\U0001F900-\U0001F9FF|\U0001F600-\U0001F64F|\U0001F680-\U0001F6FF|\U00002600-\U000026FF]
      2018-03-19 05:53:02Z
    2. 醇>

    关心Aray的答案有一些副作用。

     
    "-".gsub(/[^\p{L}\s]+/, '').squeeze(' ').strip
    => ""
    

    即使这是一个简单的减号( - )

        
    1
    2018-07-17 13:43:29Z

    我将RegEx从上面的RUBY项目转换为JavaScript友好的RegEx:

     
        /// <summary>
        /// Emoji symbols character sets (added \s and +)
        /// Unicode with עברית Delete the emoji to match 👿
        /// https://regex101.com/r/jP5jC5/3
        /// https://github.com/franklsf95/ruby-emoji-regex
        /// http://stackoverflow.com/questions/24672834/how-do-i-remove-emoji-from-string
        /// </summary>
        public const string Emoji = @"^[\s\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\u2648-\u2653\u2660\u2663\u2665-\u2666\u2668\u267B\u267F\u2692-\u2694\u2696-\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\u1F004\u1F0CF\u1F170-\u1F171\u1F17E-\u1F17F\u1F18E\u1F191-\u1F19A\u1F201-\u1F202\u1F21A\u1F22F\u1F232-\u1F23A\u1F250-\u1F251\u1F300-\u1F321\u1F324-\u1F393\u1F396-\u1F397\u1F399-\u1F39B\u1F39E-\u1F3F0\u1F3F3-\u1F3F5\u1F3F7-\u1F4FD\u1F4FF-\u1F53D\u1F549-\u1F54E\u1F550-\u1F567\u1F56F-\u1F570\u1F573-\u1F579\u1F587\u1F58A-\u1F58D\u1F590\u1F595-\u1F596\u1F5A5\u1F5A8\u1F5B1-\u1F5B2\u1F5BC\u1F5C2-\u1F5C4\u1F5D1-\u1F5D3\u1F5DC-\u1F5DE\u1F5E1\u1F5E3\u1F5EF\u1F5F3\u1F5FA-\u1F64F\u1F680-\u1F6C5\u1F6CB-\u1F6D0\u1F6E0-\u1F6E5\u1F6E9\u1F6EB-\u1F6EC\u1F6F0\u1F6F3\u1F910-\u1F918\u1F980-\u1F984\u1F9C0}]+$";
    

    用法:

     
    if (!Regex.IsMatch(vm.NameFull, RegExKeys.Emoji)) // Match means no Emoji was found
    
        
    0
    2015-08-19 11:25:45Z

    另一种选择

     
    "Scheiße! I hate emoji 😂 (123)".gsub(/[^\p{L}\s]+/, '').squeeze(' ').strip
    => "Scheiße I hate emoji"
    

    此正则表达式删除所有非单词字符(例如!😂(123))但保留unicode字母(例如本例中为ß),其中:

      

    \p{} - 匹配角色的Unicode脚本

         

    \p{L} - '信'

         

    ^ - 行开始

         

    \s - 任何空白字符

    现场演示

    更多信息关于regexp

        
    - 1
    2017-08-24 14:02:57Z
    1. 请解释您的代码的作用。那些能够理解它的人可能就是自己写的。
      2017-08-23 14:41:58Z
    2. 醇>
来源放置 这里