Como faço para remover emoji de string

Meu problema é remover emoji de uma string, mas não caracteres CJK (chinês, japonês, coreano) de uma string usando regex. Eu tentei usar este regex:

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

Este regex funciona bem, exceto que também detecta o caractere chinês, japonês e coreano, onde eu preciso desses caracteres. Alguma idéia de como resolver esse problema?

Karol S já forneceu uma solução , mas a razão pode não estar clara:

"\u1F600" é, na verdade, "\u1F60" seguido de "0" :

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

Você tem que usar chaves para pontos de código acima de FFFF:

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

Portanto, a class de caractere [\u1F600-\u1F6FF] é interpretada como [\u1F60 0-\u1F6F F] , isto é, corresponde a "\u1F60" , o intervalo "0" .. "\u1F6F" e "F" .

O uso de chaves resolve o problema:

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

Isso corresponde aos caracteres (emoji) nesses blocos unicode:

  • Emoticons U + 1F600..U + 1F64F
  • U + 1F650..U + 1F67F Dingbats Ornamentais
  • U + 1F680..U + 1F6FF Símbolos de transporte e mapa

Você também pode usar unpack , pack e between? para conseguir um resultado similar. Isso também funciona para o Ruby 1.8.7, que não suporta Unicode em expressões regulares.

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

Quanto ao seu exemplo Rubular – Emoji são caracteres únicos:

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

Enquanto os kaomoji são uma combinação de múltiplos caracteres:

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

Corresponder a estas é uma tarefa muito diferente (e você deve perguntar isso em uma questão separada).

Essa regex corresponde a todos os 845 emoji, tirados de caracteres unicode do Emoji para uso na 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}] 

Eu gerava esse regex diretamente da lista bruta de emoji Unicode. O algoritmo está aqui: https://github.com/franklsf95/ruby-emoji-regex .

Exemplo de uso:

 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 比如中文." 

Outros caracteres Unicode, como caracteres asiáticos, são preservados.

EDIT: Eu desatualizado o regex para excluir números e símbolos ASCII. Veja os comentários para detalhes.

Eu estou usando um baseado neste script .

  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 

Resultados:

 irb> strip_emoji("👽😀☂❤华み원❤") => "华み원" 
 REGEX = /[^\u{1F600}-\u{1F6FF}\s]/ 

ou

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

porque seu regex original parece indicar que você tenta encontrar tudo o que não é um amoji e não um espaço em branco e eu não sei por que você iria querer fazê-lo.

Além disso:

  • os emojis são 1F300-1F6FF em vez de 1F600-1F6FF; você pode querer mudar isso

  • Se você quiser remover todos os caracteres astrais (por exemplo, você lida com um software que não suporta todo o Unicode), você deve usar 10000-10FFFF.

EDIT: você quase certamente deseja REGEX = /[\u{1F600}-\u{1F6FF}]/ ou similar. Seu regex original correspondia a tudo que não é um espaço em branco e não está no intervalo 0-\u1F6F . Como os espaços são espaços em branco, e as letras em inglês estão no intervalo 0-\u1F6F e os caracteres chineses não estão em nenhum dos dois, os caracteres chineses correspondentes à regex e os removeram.

Em vez de remover os caracteres Emoji, você só pode include alfabetos e números. Um simples tr deve fazer o truque .tr('^A-Za-z0-9', '') . Claro que isso removerá toda a pontuação, mas você sempre poderá modificar a regex para se adequar à sua condição específica.

Este regex muito curto cobre todos os Emoji em getemoji.com até agora:

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

CUIDADO, a resposta do Aray tem alguns efeitos colaterais.

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

mesmo quando isso é suposto ser um simples menos (-)

Eu converti o RegEx do projeto RUBY acima para um RegEx amigável para JavaScript:

  ///  /// 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 ///  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}]+$"; 

Uso:

 if (!Regex.IsMatch(vm.NameFull, RegExKeys.Emoji)) // Match means no Emoji was found 

Mais uma alternativa

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

Esta regex remove todos os caracteres não-palavra (ex !😂(123) ) mas mantém as letras unicode (por exemplo, ß neste exemplo), onde:

\p{} – corresponde ao script Unicode de um personagem

\p{L} – ‘Carta’

^ – Início da linha

\s – Qualquer caractere de espaço em branco

Demonstração ao vivo

Mais informações sobre regexp

    Intereting Posts