212 votes

Supprimer les symboles

J'ai des chaînes avec toutes sortes de différents emojis / images / signes en eux.

Toutes les chaînes ne sont pas en anglais - certaines d'entre elles sont dans d'autres langues que le latin, par exemple:

 ▓ railway??
→ Cats and dogs
I'm on  

322voto

Nick Bull Points 6359

Au lieu de la liste noire de certains éléments, comment sur la création d'une liste blanche des personnages que vous souhaitez conserver? De cette façon, vous n'avez pas besoin de vous soucier de tous les nouveaux emoji ajouté.

String characterFilter = "[^\\p{L}\\p{M}\\p{N}\\p{P}\\p{Z}\\p{Cf}\\p{Cs}\\s]";
String emotionless = aString.replaceAll(characterFilter,"");

Donc:

  • [\\p{L}\\p{M}\\p{N}\\p{P}\\p{Z}\\p{Cf}\\p{Cs}\\s] est une gamme de représentant toutes les numériques (\\p{N}), lettre (\\p{L}), la marque (\\p{M}), la ponctuation (\\p{P}), les espaces/séparateur (\\p{Z}), les autres mises en forme (\\p{Cf}) et d'autres caractères ci-dessus U+FFFF en Unicode (\\p{Cs}), et retour à la ligne,\\s) des caractères. \\p{L} spécifiquement comprend les caractères à partir d'autres alphabets Cyrillique, Latin, Kanji, etc.
  • L' ^ dans la regex jeu de caractères annule le match.

Exemple:

String str = "hello world _# 皆さん、こんにちは! 私はジョンと申します。

83voto

Daniel Wagner Points 38831

Je ne suis pas super en Java, donc je ne vais pas essayer d'écrire un exemple de code en ligne, mais la façon dont je voudrais faire c'est de vérifier ce que Unicode appelle "la catégorie générale" de chaque personnage. Il ya un couple de lettre et la ponctuation catégories.

Vous pouvez utiliser le Caractère.getType pour trouver la catégorie générale d'un personnage donné. Vous devriez probablement conserver ces personnages qui tombent dans ces catégories générales:

COMBINING_SPACING_MARK
CONNECTOR_PUNCTUATION
CURRENCY_SYMBOL
DASH_PUNCTUATION
DECIMAL_DIGIT_NUMBER
ENCLOSING_MARK
END_PUNCTUATION
FINAL_QUOTE_PUNCTUATION
FORMAT
INITIAL_QUOTE_PUNCTUATION
LETTER_NUMBER
LINE_SEPARATOR
LOWERCASE_LETTER
MATH_SYMBOL
MODIFIER_LETTER
MODIFIER_SYMBOL
NON_SPACING_MARK
OTHER_LETTER
OTHER_NUMBER
OTHER_PUNCTUATION
PARAGRAPH_SEPARATOR
SPACE_SEPARATOR
START_PUNCTUATION
TITLECASE_LETTER
UPPERCASE_LETTER

(Tous les personnages que vous avez énuméré comme spécifiquement vouloir supprimer généraux, de la catégorie OTHER_SYMBOL, que je n'ai pas inclure dans la catégorie ci-dessus une liste blanche.)

49voto

Karol Dowbecki Points 27852

Basée sur la Pleine Emoji Liste, v11.0 vous avez 1644 différents points de code Unicode pour le retirer. Par exemple est sur cette liste, U+2705.

Avoir la liste complète des émoticônes vous avez besoin de filtrer à l'aide de points de code. Parcourir seul char ou byte ne fonctionne pas comme seul point de code peut s'étendre sur plusieurs octets. Parce que Java utilise l'UTF-16 émoticônes, en général, deux chars.

String input = "ab✅cd";
for (int i = 0; i < input.length();) {
  int cp = input.codePointAt(i);
  // filter out if matches
  i += Character.charCount(cp); 
}

La cartographie de point de code Unicode U+2705 de Java int est simple:

int viSign = 0x2705;

ou depuis Java prend en charge Unicode:

int viSign = "✅".codePointAt(0);

21voto

Daniel F Points 251

ICU4J est votre ami.

 UCharacter.hasBinaryProperty(UProperty.EMOJI);
 

N'oubliez pas de garder votre version de icu4j à jour et notez que cela ne fera que filtrer les emoji Unicode officiels, pas les caractères symboliques. Combinez avec le filtrage des autres types de caractères comme vous le souhaitez.

Plus d'informations: http://icu-project.org/apiref/icu4j/com/ibm/icu/lang/UProperty.html#EMOJI

10voto

Marcos Zolnowski Points 836

J'ai donné quelques exemples ci-dessous et je pensais que le latin suffisait, mais ...

Existe-t-il un moyen de supprimer tous ces signes de la chaîne d'entrée et de ne conserver que les lettres et la ponctuation dans les différentes langues?

Après l’édition, nous avons mis au point une nouvelle solution utilisant la méthode Character.getType , ce qui semble être la meilleure solution.

 package zmarcos.emoji;

import java.util.Arrays;
import java.util.HashSet;
import java.util.Set;

public class TestEmoji {

    public static void main(String[] args) {
        String[] arr = {"Remove ✅,  

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X