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

Dotnet Discussion :

[REGEX] Vérifier l'existance d'un mot, y compris avec apostrophes, pontuation, etc.


Sujet :

Dotnet

  1. #1
    Invité
    Invité(e)
    Par défaut [REGEX] Vérifier l'existance d'un mot, y compris avec apostrophes, pontuation, etc.
    Bonjour à tous,

    Je cherche à écrire une Regex qui me permette de savoir si un mot est contenu dans une chaîne.
    Je me serais bien satisfait d'un simple "String.Contains", mais il me renvoie true même quand la chaîne recherchée ne correspond pas à un mot entier.

    La difficulté c'est d'inclure les mots qui commencent par une apostrophe, ou qui sont précédés ou suivis d'un signe de ponctuation. Bien sûr il faut inclure les accents, etc...

    Si quelqu'un pouvait me donner au moins un début de piste, j'ai passé le week-end à essayer de trouver l'info mais...

    Merci à vous!

  2. #2
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 749
    Points
    39 749
    Par défaut
    Dans une regex tu peux prendre en compte les limites (début ou fin) de mot, avec le caractère "\b". Par exemple, cette regex cherche le mot entier "Hello" : "\bHello\b"

    Qu'est-ce que tu veux dire par "inclure les accents" ?

  3. #3
    Invité
    Invité(e)
    Par défaut
    Salut,

    Merci déjà de l'info. J'avais "cru trouver" sur google la séquence "/b\" mais ça ne marchait pas...


    Concernant les accents, j'aimerais que la recherche fonctionne pour "éclaire", "éclairé", etc.
    Je ne sais pas si c'est possible de faire ça dans une seule Regex, ou s'il faut que je transforme d'abord mon pattern pour supprimer tous les accents et les remplacer par la voyelle correspondante...?

    (d'ailleurs il existe une fonction dans le framework pour faire ça, ou il faut que j'écrive par ma propre routine...?)

  4. #4
    Invité
    Invité(e)
    Par défaut
    ...arf non, je voudrais un peu mieux que ça:

    Typiquement, quand je recherche "clair", je voudrais les résultats suivants:
    "clair" --> OUI
    "éclaire" --> NON
    "clair," --> OUI

    Là je prends l'exemple de la virgule, mais on peut imaginer n'importe quel signe de ponctuation...

    ...ou alors, il serait peut-être plus simple que je supprime d'abord tous les signes de ponctuation, et que je passe ma Regex après ?
    ...je vais peut-être faire ça, ça me paraît plus simple (et surtout, à ma portée).

    Mais par curiosité, j'aimerais bien qu'on m'explique si c'est possible avec une regex. Merci d'avance!

  5. #5
    Expert éminent
    Avatar de StormimOn
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2005
    Messages
    2 593
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2005
    Messages : 2 593
    Points : 7 660
    Points
    7 660
    Par défaut
    Citation Envoyé par Glumph
    Concernant les accents, j'aimerais que la recherche fonctionne pour "éclaire", "éclairé", etc.
    Je ne sais pas si c'est possible de faire ça dans une seule Regex, ou s'il faut que je transforme d'abord mon pattern pour supprimer tous les accents et les remplacer par la voyelle correspondante...?
    Avec l'expression \b\p{L}+\b cela devrait fonctionner. \p{L} correspond à un caractère Unicode de la catégorie "lettre".

    Citation Envoyé par Glumph
    ou alors, il serait peut-être plus simple que je supprime d'abord tous les signes de ponctuation, et que je passe ma Regex après ?
    Inutile avec l'expression précédente. "clair," renverra "clair".

    Citation Envoyé par Glumph
    d'ailleurs il existe une fonction dans le framework pour faire ça, ou il faut que j'écrive par ma propre routine...?
    De base cela n'existe pas, mais ça se trouve. La méthode "classique" consiste à passer par la normalisation

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    public static string RemoveDiacritics(string s)
    {
      string normalizedString = s.Normalize(NormalizationForm.FormD);
      stringBuilder stringBuilder = new StringBuilder();
     
      for (int i = 0; i < normalizedString.Length; i++)
      {
        char c = normalizedString[i];
        if (CharUnicodeInfo.GetUnicodeCategory(c) != UnicodeCategory.NonSpacingMark)
          stringBuilder.Append(c);
      }
     
      return stringBuilder.ToString().Normalize(NormalizationForm.FormC);
    }
    Pas de questions techniques par MP

  6. #6
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par StormimOn Voir le message
    Avec l'expression \b\p{L}+\b cela devrait fonctionner. \p{L} correspond à un caractère Unicode de la catégorie "lettre".
    Alors, je ne comprends pas.
    Je cherche simplement à écrire ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Dim regex = New Text.RegularExpressions.Regex("/b" & TexteRecherché & "/b")
    If regex.isMatch(monTexte) = True then...
    L'idée c'est de faire un pseudo-moteur de recherche sur ma base de données.
    J'imagine que la concaténation de ma String n'est pas une bonne idée...?

    Citation Envoyé par StormimOn Voir le message
    De base cela n'existe pas, mais ça se trouve. La méthode "classique" consiste à passer par la normalisation
    Merci pour l'exemple, je vais rajouter ça dans ma bibliothèque de méthodes d'extensions.

  7. #7
    Expert éminent
    Avatar de StormimOn
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2005
    Messages
    2 593
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2005
    Messages : 2 593
    Points : 7 660
    Points
    7 660
    Par défaut
    Citation Envoyé par Glumph
    Alors, je ne comprends pas.
    Normal, c'est moi qui n'avait pas compris que tu cherchais un mot en particulier ^^
    Tu seras obligé de retirer les accents à ce moment effectivement.
    Pas de questions techniques par MP

  8. #8
    Invité
    Invité(e)
    Par défaut
    Ok...

    Bah dans ce cas là je vais vérifier l'existence d'une occurrence dans MatchesCollection, après avoir retiré les accents.

    Merci encore de votre aide !

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

Discussions similaires

  1. Vérifier l'existance d'un mot dans un dictionnaire
    Par saad.hessane dans le forum Algorithmes et structures de données
    Réponses: 10
    Dernier message: 10/08/2008, 19h45
  2. Réponses: 3
    Dernier message: 05/04/2005, 14h36
  3. Réponses: 3
    Dernier message: 24/06/2004, 11h23
  4. Vérifier l'existence d'un répertoire
    Par Crazyblinkgirl dans le forum ASP
    Réponses: 4
    Dernier message: 24/06/2004, 11h13
  5. [Regex] Vérifier qu'une chaîne respecte une expression régulière
    Par PeteMitchell dans le forum Collection et Stream
    Réponses: 7
    Dernier message: 13/05/2004, 14h22

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