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

kil*_*lua 18 ruby regex unicode emoji

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

REGEX = /[^\u1F600-\u1F6FF\s]/i
Run Code Online (Sandbox Code Playgroud)

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

Ste*_*fan 28

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

"\u1F600"实际上"\u1F60"接着是"0":

"\u1F60"    # => "?"
"\u1F600"   # => "?0"
Run Code Online (Sandbox Code Playgroud)

您必须使用花括号来表示FFFF以上的代码点:

"\u{1F600}" #=> ""
Run Code Online (Sandbox Code Playgroud)

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

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

/[\u{1F600}-\u{1F6FF}]/
Run Code Online (Sandbox Code Playgroud)

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


您还可以使用unpack,packbetween?实现类似的结果.这也适用于Ruby 1.8.7,它在正则表达式中不支持Unicode.

s = 'Hi!'
#=> "Hi!\360\237\230\200"

s.unpack('U*').reject{ |e| e.between?(0x1F600, 0x1F6FF) }.pack('U*')
#=> "Hi!" 
Run Code Online (Sandbox Code Playgroud)

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

"".length  #=> 1
"".chars   #=> [""]
Run Code Online (Sandbox Code Playgroud)

kaomoji是多个字符的组合:

"^_^".length #=> 3
"^_^".chars  #=> ["^", "_", "^"]
Run Code Online (Sandbox Code Playgroud)

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


小智 16

我正在使用基于此脚本的一个.

 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
Run Code Online (Sandbox Code Playgroud)

结果:

irb> strip_emoji("??????")
=> "???"
Run Code Online (Sandbox Code Playgroud)

  • 警告:此答案中的代码不会删除所有表情符号。它可以很好地删除简单的表情符号,但不能完全正确删除多代码点表情符号,例如 ‍‍‍ 或 ☸️。 (2认同)

fra*_*f95 14

这个正则表达式匹配所有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}]
Run Code Online (Sandbox Code Playgroud)

我直接从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 ????."
Run Code Online (Sandbox Code Playgroud)

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

编辑:我使用正则表达式来排除ASCII数字和符号.请参阅评论了解详情


Kar*_*l S 8

REGEX = /[^\u{1F600}-\u{1F6FF}\s]/
Run Code Online (Sandbox Code Playgroud)

要么

REGEX = /[\u{1F600}-\u{1F6FF}\s]/
REGEX = /[\u{1F600}-\u{1F6FF}]/
REGEX = /[^\u{1F600}-\u{1F6FF}]/
Run Code Online (Sandbox Code Playgroud)

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

也:

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

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

编辑:你几乎肯定想要REGEX = /[\u{1F600}-\u{1F6FF}]/或类似.你的原始正则表达式匹配的不是空格,而不是范围0-\u1F6F.由于空格是空格,英文字母在范围内0-\u1F6F,而汉字不在,因此正则表达式匹配汉字并删除它们.


Jer*_*ert 5

此主题中的大多数答案不能正确删除所有表情符号。他们可以删除简单的表情符号。但是他们不会完全删除像???这样的多代码点表情符号。或??,留下一些残余的unicode代码点。

您可以使用unicode-emoji之类的gem 来获取最新的emoji正则表达式,但是如果您发现这种过大的杀伤力,则以下代码可能是一个很好的解决方案:

text.gsub(/[^[:alnum:][:blank:][:punct:]]/, '').squeeze(' ').strip
Run Code Online (Sandbox Code Playgroud)

这将删除不是基本unicode字母数字/点/空白的任何表情符号或类似怪异的unicody的字符。