wake-up-neo.com

Wie entferne ich Emoji von String

Mein Problem ist, Emoji aus einer Zeichenfolge zu entfernen, aber keine CJK-Zeichen (Chinesisch, Japanisch, Koreanisch) aus einer Zeichenfolge mit Regex. Ich habe versucht, diese Regex zu verwenden:

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

Dieser reguläre Ausdruck funktioniert gut, außer dass er auch die chinesischen, japanischen und koreanischen Zeichen erkennt, an denen ich diese Zeichen benötige. Irgendeine Idee, wie man dieses Problem löst?

18
kilua

Karol S hat bereits eine Lösung angegeben, der Grund ist jedoch möglicherweise nicht klar:

"\u1F600" ist eigentlich "\u1F60", gefolgt von "0":

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

Sie müssen geschweifte Klammern für Codepunkte über FFFF verwenden:

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

Daher wird die Zeichenklasse [\u1F600-\u1F6FF] als [\u1F60 0-\u1F6F F] interpretiert, d. H. Sie entspricht "\u1F60", dem Bereich "0".."\u1F6F" und "F".

Die Verwendung von geschweiften Klammern löst das Problem:

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

Dies entspricht (Emoji) Zeichen in diesen Unicode-Blöcken:


Sie können auch unpack , pack und between? verwenden, um ein ähnliches Ergebnis zu erzielen. Dies funktioniert auch für Ruby 1.8.7, das Unicode in regulären Ausdrücken nicht unterstützt. 

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

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

Bezüglich Ihres Rubular-Beispiels - Emoji handelt es sich um Einzelzeichen:

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

Kaomoji ist eine Kombination mehrerer Zeichen:

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

Dies abzugleichen ist eine ganz andere Aufgabe (und Sie sollten dies in einer separaten Frage fragen).

28
Stefan

Dieser reguläre Ausdruck entspricht allen 845 Emojis aus Emoji-Unicode-Zeichen für die Verwendung im 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}]

Ich habe diesen Regex direkt aus der Rohliste des Unicode-Emoji generiert. Der Algorithmus ist hier: https://github.com/franklsf95/Ruby-emoji-regex .

Verwendungsbeispiel:

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

Andere Unicode-Zeichen wie z. B. asiatische Zeichen werden beibehalten.

BEARBEITEN: Ich änderte den Regex, um ASCII -Zahlen und -Symbole auszuschließen. Siehe Kommentare für Details.

14
franklsf95

Ich verwende eins basierend auf diesem Skript .

 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

Ergebnisse:

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

oder

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

ihr ursprünglicher Regex scheint zu zeigen, dass Sie versuchen, alles zu finden, was kein Amoji und kein Leerzeichen ist, und ich weiß nicht, warum Sie dies tun möchten.

Ebenfalls:

  • die Emojis sind 1F300-1F6FF und nicht 1F600-1F6FF; Vielleicht möchten Sie das ändern

  • wenn Sie alle astralen Zeichen entfernen möchten (z. B. eine Software, die nicht Unicode unterstützt), sollten Sie 10000-10FFFF verwenden.

BEARBEITEN: Sie wollen fast REGEX = /[\u{1F600}-\u{1F6FF}]/ oder ähnliches. Ihr ursprünglicher Regex entsprach alles, was kein Leerzeichen ist und nicht im Bereich 0-\u1F6F liegt. Da Leerzeichen Leerzeichen sind und sich englische Buchstaben im Bereich 0-\u1F6F befinden, und chinesische Zeichen in keinem der beiden stehen, wurden die regulären Ausdrücke mit den chinesischen Zeichen übereinstimmen und entfernt.

8
Karol S

CARE die Antwort von Aray hat einige Nebenwirkungen.

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

selbst wenn dies ein einfaches Minus (-) sein soll

1
Filipe Santiago

Anstatt Emoji-Zeichen zu entfernen, können Sie nur Alphabete und Zahlen einschließen. Ein einfaches tr sollte den Trick tun, .tr('^A-Za-z0-9', ''). Natürlich werden dadurch alle Satzzeichen entfernt, aber Sie können den Regex jederzeit an Ihre speziellen Bedingungen anpassen.

1
Swaathi Kakarla

Diese sehr kurze Regex umfasst alle Emoji in getemoji.com bis jetzt:

[\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
Tan

Die meisten Antworten in diesem Thread entfernen nicht alle Emojis korrekt. Sie entfernen einfache Emojis wie. Aber sie werden nicht mehrere Codepunkt-Emojis wie ???? ‍ ???? ‍ ???? ‍ ???? vollständig entfernen. oder ☸️, wobei einige verbleibende Unicode-Codepunkte zurückbleiben.

Sie könnten einen Edelstein wie unicode-emoji verwenden, um die neuesten Emoji-Regexes zu erhalten, aber wenn Sie diesen Overkill finden, könnte der folgende Code eine gute Lösung sein:

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

Dadurch werden alle Emoji- oder seltsam-unicody-ähnlichen Zeichen entfernt, bei denen es sich nicht um ein einfaches Unicode-Alphanum/Punkt/Leerzeichen handelt.

0
Jerome Dalbert

Ich habe das RegEx aus dem Ruby-Projekt oben in ein JavaScript-freundliches RegEx konvertiert:

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

Verwendungszweck:

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