IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Collection et Stream Java Discussion :

[Regex] Supprimer les caractères spéciaux


Sujet :

Collection et Stream Java

  1. #1
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2011
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2011
    Messages : 20
    Par défaut [Regex] Supprimer les caractères spéciaux
    Bonjour,

    A partir d'un texte je souhaite supprimer tous les caractères spéciaux et les remplacer par un espace de manière à ne garder en gros que les caractères correspondant au format UTF-8.

    Est-ce qu'il y a un moyen raccourci de le faire avec une Regex ou est-ce que je dois rentrer tous les caractères que je veux conserver "à la main" du genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    plainText.replaceAll("[^\\wàâäÄÀÂéèêëÈÊËìîïÌÏÎòöôÒÖÔùüûÙÜÛç!#$€%&'`(),;:/@...]", " ")

  2. #2
    Membre Expert Avatar de Uther
    Homme Profil pro
    Tourneur Fraiseur
    Inscrit en
    Avril 2002
    Messages
    4 678
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Tourneur Fraiseur

    Informations forums :
    Inscription : Avril 2002
    Messages : 4 678
    Par défaut
    Il faudrait préciser ce que tu appelle caractère spéciaux ou les caractères non spéciaux, ça serait même plus simple. "Les caractères correspondant au format UTF-8" ne veut pas dire grand chose vu que l'utf-8 est une façon d'encoder de l'unicode qui permet de représenter tous les caractères (lettres, chiffres, symboles,...) de presque toutes le langues.

    Je pense la pseudo-classe qui matche uniquement les caractères qui correspondent à des lettres dans la norme Unicode peut t’intéresser.
    Dans ton exemple ça donnerait
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    plainText.replaceAll("[^\\d\\p{L}!#$€%&'`(),;:/@...]", " ")

  3. #3
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2011
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2011
    Messages : 20
    Par défaut
    En fait ce que je voulais dire c'est que je souhaitais nettoyer mon texte de tout ce qui n'est ni lettre ni ponctuation.

    J'ai essayé le mais ça ne marche pas.

    Je pense que je vais faire comme j'étais parti, rentrer à la main tous les caractères que je souhaite garder, ce qui me donnerait quelque chose comme ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    plainText.replaceAll("[^\\w\\s\\p{Punct}ÀÁÂÄÇÈÉÊËÌÍÎÏÑÒÓÔÕÖÙÚÛÜÝàáâãäçèéêëìíîïñòóôõöùúûüýÿ]", " ");

  4. #4
    Rédacteur/Modérateur
    Avatar de Logan Mauzaize
    Homme Profil pro
    Architecte technique
    Inscrit en
    Août 2005
    Messages
    2 894
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : Transports

    Informations forums :
    Inscription : Août 2005
    Messages : 2 894
    Par défaut
    Tous les caractères occidentaux appartiennent à UTF-8
    Java : Cours et tutoriels - FAQ - Java SE 8 API - Programmation concurrente
    Ceylon : Installation - Concepts de base - Typage - Appels et arguments

    ECM = Exemple(reproduit le problème) Complet (code compilable) Minimal (ne postez pas votre application !)
    Une solution vous convient ? N'oubliez pas le tag
    Signature par pitipoisson

  5. #5
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2011
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2011
    Messages : 20
    Par défaut
    Finalement le \p{L} correspondait bien à ce que je cherchais

    Maintenant, j'ai une regex qui va extraire des mots commençant par une majuscule. Mais je voudrais lui rentrer toute une liste de mots qu'elle doit ignorer. Je sais qu'on peut le faire avec une assertion négative mais comme ma liste de mots est assez importante c'est pas le top. Est-ce que c'est possible de relier une regex avec un String[] ? Ou autrement ?

  6. #6
    Membre Expert Avatar de Uther
    Homme Profil pro
    Tourneur Fraiseur
    Inscrit en
    Avril 2002
    Messages
    4 678
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Tourneur Fraiseur

    Informations forums :
    Inscription : Avril 2002
    Messages : 4 678
    Par défaut
    Non.

    Je pense qu'il faudra le faire en deux temps.
    D'abord, tu récupères les mots qui commencent par une majuscule via un expression régulière du type Ensuite tu itères sur les résultats pour retirer ceux qui sont dans ta liste de mots interdits.

  7. #7
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2011
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2011
    Messages : 20
    Par défaut
    J'ai un souci avec une assertion négative. Par exemple, si je veux récupérer un mot commençant par une majuscule, sauf s'il se trouve juste après le "mot_interdit". Voila comment serait mon expression régulière

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ((?!mots_interdit)[\\p{Lu}]{2,})
    Mais ça ne marche pas, y'a un truc que j'ai pas du capter...

  8. #8
    Membre Expert Avatar de Uther
    Homme Profil pro
    Tourneur Fraiseur
    Inscrit en
    Avril 2002
    Messages
    4 678
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Tourneur Fraiseur

    Informations forums :
    Inscription : Avril 2002
    Messages : 4 678
    Par défaut
    En effet les groupes lookahead (positifs comme négatifs) font une vérification sans consommer pas les caractères. Dans ton cas la recherche va donc porter sur les caractères de ton résultat et non les caractères qui le précèdent.

    Si tu veux que la recherche se face sur les caractères précédent ton mot il faut utiliser la forme dite lookbehind : (?<!expression).
    Dans ton cas, ca donnerait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ((?<!mots_interdit)[\\p{Lu}]{2,})

  9. #9
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2011
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2011
    Messages : 20
    Par défaut
    Ah ok, merci

    J'ai une autre question

    Si je veux exclure une chaine de caractères de mon Pattern je mets (?!mot_exclu) au début du Pattern, c'est bien ça? Comme là, où je lui demande de me renvoyer tous les mots sauf "exemple" :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Pattern p = Pattern.compile("(?!exemple)(\\p{L}+)");
    Matcher m = p.matcher("petit exemple");
    Le problème c'est qu'au lieu de me renvoyer seulement "petit", il me renvoit

  10. #10
    Membre Expert Avatar de Uther
    Homme Profil pro
    Tourneur Fraiseur
    Inscrit en
    Avril 2002
    Messages
    4 678
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Tourneur Fraiseur

    Informations forums :
    Inscription : Avril 2002
    Messages : 4 678
    Par défaut
    En effet l'expression régulière travaille caractère par caractère: si tu veux limiter au mot, tu peux utiliser le séparateur de mots: "\b"

    Dans ton exemple:Pattern p = Pattern.compile("(?!exemple)\\b(\\p{L}+)");

  11. #11
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2011
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2011
    Messages : 20
    Par défaut
    ça marche, incollable sur les regex Uther ! merci bien

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [XL-2007] Supprimer les caractères spéciaux
    Par Yolak dans le forum Macros et VBA Excel
    Réponses: 12
    Dernier message: 17/01/2017, 15h56
  2. [XSLT] Supprimer les caractères spéciaux HTML d'un noeud texte
    Par Invité dans le forum XSL/XSLT/XPATH
    Réponses: 6
    Dernier message: 25/12/2008, 22h59
  3. Supprimer les caractères spéciaux
    Par sami_c dans le forum Langage
    Réponses: 4
    Dernier message: 09/09/2008, 13h12
  4. Supprimer les caractères spéciaux
    Par snopims dans le forum C#
    Réponses: 8
    Dernier message: 08/08/2008, 15h33
  5. [Jsp] Supprimer les caractère spéciaux d'une chaine
    Par PeteMitchell dans le forum Servlets/JSP
    Réponses: 4
    Dernier message: 13/05/2004, 11h11

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo