Ich habe einige Zeichenfolgen mit allen möglichen Emojis / Bildern / Zeichen.
Nicht alle Zeichenfolgen sind in Englisch - einige von ihnen sind in anderen nicht-lateinischen Sprachen, zum Beispiel:
▓ railway??
→ Cats and dogs
I'm on 🔥
Apples ⚛
✅ Vi sign
♛ I'm the king ♛
Corée ♦ du Nord ☁ (French)
gjør at både ◄╗ (Norwegian)
Star me ★
Star ⭐ once more
早上好 ♛ (Chinese)
Καλημέρα ✂ (Greek)
another ✓ sign ✓
добрай раніцы ✪ (Belarus)
◄ शुभ प्रभात ◄ (Hindi)
✪ ✰ ❈ ❧ Let's get together ★. We shall meet at 12/10/2018 10:00 AM at Tony's.❉
... und viele mehr davon.
Ich möchte all diese Zeichen / Bilder loswerden und nur die Buchstaben (und Satzzeichen) in den verschiedenen Sprachen behalten.
Ich habe versucht, die Schilder mit der EmojiParser-Bibliothek zu reinigen :
String withoutEmojis = EmojiParser.removeAllEmojis(input);
Das Problem ist, dass EmojiParser die meisten Zeichen nicht entfernen kann. Das ♦ Zeichen ist das einzige, das ich bis jetzt gefunden habe, als es entfernt wurde. Andere Zeichen wie ✪ ❉ ★ ✰ ❈ ❧ ❧ ✂ ❋ ⓡ ✿ not not werden nicht entfernt.
Gibt es eine Möglichkeit, alle diese Zeichen aus den Eingabezeichenfolgen zu entfernen und nur die Buchstaben und Satzzeichen in den verschiedenen Sprachen beizubehalten?
Antworten:
Wie wäre es, eine Whitelist der Charaktere zu erstellen, die Sie behalten möchten, anstatt einige Elemente auf die schwarze Liste zu setzen? Auf diese Weise müssen Sie sich nicht um jedes neue Emoji kümmern, das hinzugefügt wird.
So:
[\\p{L}\\p{M}\\p{N}\\p{P}\\p{Z}\\p{Cf}\\p{Cs}\\s]
ist ein Bereich, der alle numerischen (\\p{N}
), Buchstaben (\\p{L}
), Markierungen (\\p{M}
), Satzzeichen (\\p{P}
), Leerzeichen / Trennzeichen (\\p{Z}
), anderen Formatierungszeichen (\\p{Cf}
) und anderen Zeichen obenU+FFFF
in Unicode (\\p{Cs}
) und Zeilenumbrüche (\\s
) darstellt. Enthält\\p{L}
speziell die Zeichen aus anderen Alphabeten wie Kyrillisch, Latein, Kanji usw.^
im regulären Ausdruck enthaltene Zeichensatz negiert die Übereinstimmung.Beispiel:
Wenn Sie weitere Informationen benötigen, lesen Sie die Java- Dokumentation für reguläre Ausdrücke.
quelle
[^\w\^\-\[\]\.!@#$%&*\(\)/+'":;~?,]
aber ich bin nur robust und versuche, alle typischen Zeichen zu sammeln, die es nicht gibt keine Symbole). Upvoted, weil dies definitiv eine mögliche Lösung ist. Wenn er andere Sprachzeichen hinzufügen möchte, kann er diese nach Bedarf zum Ausdruck hinzufügen.p{L}
nicht-englische alphabetische Zeichen behandelt . Ich hoffe, es versteht sich, dass ich in meiner Antwort nicht jedes nicht-englische Alphabet ausführlich auflisten kann, da dies unpraktisch ausführlich wäre."[^\\p{L}\\p{M}\\p{N}\\p{P}\\p{Z}\\p{Cf}\\s]"
. Dies ermöglicht die allgemeinen Kategorien Buchstaben, Markierungen, Zahlen, Interpunktion, Trennzeichen und "Andere, Format" sowie Leerzeichen wie Tabulatoren und Zeilenumbrüche.Ich mag Java nicht besonders, daher werde ich nicht versuchen, Beispielcode inline zu schreiben, aber ich würde dies tun, um zu überprüfen, was Unicode "die allgemeine Kategorie" jedes Zeichens nennt. Es gibt einige Buchstaben- und Interpunktionskategorien.
Mit Character.getType können Sie die allgemeine Kategorie eines bestimmten Zeichens ermitteln. Sie sollten wahrscheinlich die Zeichen behalten, die in diese allgemeinen Kategorien fallen:
(Alle Zeichen, die Sie als speziell entfernen möchten, haben eine allgemeine Kategorie
OTHER_SYMBOL
, die ich nicht in die Whitelist der obigen Kategorie aufgenommen habe.)quelle
Character.getType()
nicht, ob es sich bei Ihremchar
(oderint
Codepunkt, da die Methode überladen ist) beispielsweise um ein Emoticon, ein Musiksymbol, ein Emoji-Zeichen usw. handelt. Wenn Sie einen einfachen Anwendungsfall haben, ist dies möglicherweise in Ordnung Diesen Weg zu gehen - es ist sicherlich ein eleganter Ansatz, der leicht zu verstehen ist -, aber seien Sie sich bewusst, dass er brechen kann, wenn sich die Anforderungen ändern.Basierend auf der vollständigen Emoji-Liste, Version 11.0 , müssen 1644 verschiedene Unicode-Codepunkte entfernt werden. Zum Beispiel
✅
steht auf dieser Liste alsU+2705
.Wenn Sie die vollständige Liste der Emojis haben, müssen Sie sie mithilfe von Codepunkten herausfiltern . Das Iterieren über einzelne
char
oderbyte
nicht als einzelner Codepunkt kann mehrere Bytes umfassen. Da Java UTF-16-Emojis verwendet, dauert es normalerweise zweichar
Sekunden.Die Zuordnung vom Unicode-Codepunkt
U+2705
zu Javaint
ist unkompliziert:oder da Java Unicode-Zeichenfolgen unterstützt:
quelle
input.codePointAt
nur maximal 2 Zeichen angezeigt werden, was eine konstante Obergrenze ist. Außerdemi += Character.charCount(cp)
überspringt (das neu hinzugefügte) alleinput.codePointAt
geprüften Zeichen (in einigen Eckfällen minus 1).String.chars()
Streams über Zeichen, nicht über Codepunkte. Dafür gibt es eine separate MethodeString.codePoints()
.ICU4J ist dein Freund.
Denken Sie daran, Ihre Version von icu4j auf dem neuesten Stand zu halten, und beachten Sie, dass dadurch nur offizielle Unicode-Emoji herausgefiltert werden, keine Symbolzeichen. Kombinieren Sie dies wie gewünscht mit dem Herausfiltern anderer Zeichentypen.
Weitere Informationen: http://icu-project.org/apiref/icu4j/com/ibm/icu/lang/UProperty.html#EMOJI
quelle
Ich habe unten einige Beispiele gegeben und dachte, dass Latein genug ist, aber ...
Entwickelte nach der Bearbeitung eine neue Lösung unter Verwendung der
Character.getType
Methode, und das scheint der beste Schuss zu sein.Ausgabe:
Der Code funktioniert durch Streaming des Strings zu Codepunkten. Verwenden Sie dann Lambdas, um Zeichen in a zu filtern
int
Array , und konvertieren Sie das Array in String.Die Buchstaben und Leerzeichen werden mit den Zeichenmethoden gefiltert, was bei der Interpunktion nicht gut ist. Versuch fehlgeschlagen .
Der Unicode blockiert den Weißfilter unter Verwendung der Unicode-Blöcke, die der Programmierer als zulässig angibt. Versuch fehlgeschlagen .
Der Unicode blockiert den Schwarzfilter unter Verwendung der Unicode-Blöcke, die der Programmierer als nicht zulässig angibt. Versuch fehlgeschlagen .
Der Kategoriefilter mit der statischen Methode
Character.getType
. Der Programmierer kann imcategory
Array definieren, welche Typen zulässig sind. WERKE 😨😱😰😲😀.quelle
import java.lang.Character.UnicodeBlock;
dannCharacter.UnicodeBlock
->UnicodeBlock
.white list
Beispiel.Probieren Sie dieses Projekt aus simple-emoji-4j
Kompatibel mit Emoji 12.0 (2018.10.15)
Einfach mit:
quelle
Verwenden Sie ein jQuery-Plugin namens RM-Emoji. So funktioniert das:
Dies ist der schnelle Modus, in dem möglicherweise einige Emojis fehlen, da heuristische Algorithmen zum Auffinden von Emojis im Text verwendet werden. Verwenden Sie die
.full()
Methode, um die gesamte Zeichenfolge zu scannen und alle garantierten Emojis zu entfernen.quelle