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

Langage Java Discussion :

Recherche de mots correspondants à un pattern


Sujet :

Langage Java

  1. #1
    Membre régulier
    Homme Profil pro
    Hobby
    Inscrit en
    Août 2002
    Messages
    125
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Hobby

    Informations forums :
    Inscription : Août 2002
    Messages : 125
    Points : 82
    Points
    82
    Par défaut Recherche de mots correspondants à un pattern
    Bonjour !

    Ma demande concerne simplement l'obtention d'une idée concernant la recherche de mots présents dans un tableau de Strings, mots correspondants à un pattern.

    Par exemple, le pattern
    "?A???N"
    accepte les mots "MAISON" et SAISON", mais pas "ZIRCON".

    L'embryon de code ci-après fonctionne, mais est fort primaire.
    Existe-t-il un moyen plus évolué de réaliser cette recherche ?
    Merci pour votre aide.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    public class Main {
      public static void main(String[] args) {
        String pattern = "?A???N";
        String[] words = new String[]{
          "MAISON", "RAISON", "CUIVRE",
          "BAGDES", "ZIRCON", "SAISON" };
     
        boolean status = false;
        for (int i = 0; i < words.length; i++) {
          for (int j = 0; j < pattern.length(); j++) {
            if (pattern.charAt(j) == '?') {
              continue;
            } else if (pattern.charAt(j) == words[i].charAt(j)) {
              status = true;
            } else {
              status = false;
              break;
            }
          }
          if (status == true) System.out.println(words[i]);
        }
      }
    }
     
    // Affiche :
    MAISON
    RAISON
    SAISON

  2. #2
    Modérateur
    Avatar de OButterlin
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    7 311
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 7 311
    Points : 9 524
    Points
    9 524
    Billets dans le blog
    1
    Par défaut
    Avec une Regexp ça serait plus simple.
    Là c'est un exemple qui ignore la casse :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    private static List<String> values = Arrays.asList("Maison", "Raison", "Cuivre", "Badges", "Zircon", "Saison");
     
    public static void main(String[] args)
    {
        Pattern pattern = Pattern.compile("(.a..on)", Pattern.CASE_INSENSITIVE);
        for (String value : values)
        {
            Matcher matcher = pattern.matcher(value);
            if (matcher.find())
            {
                System.out.println(matcher.group(1) + " correspond à la recherche");
            }
        }
    }
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  3. #3
    Membre régulier
    Homme Profil pro
    Hobby
    Inscrit en
    Août 2002
    Messages
    125
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Hobby

    Informations forums :
    Inscription : Août 2002
    Messages : 125
    Points : 82
    Points
    82
    Par défaut
    @OButterlin
    Merci pour votre code qui répond parfaitement au problème.
    Il me faut vraiment étudier les regex !

    Je me suis permis de le modifier quelque peu pour un usage plus général : ajout du pattern à trouver (strToSearchFor) et gestion des ajouts à la liste (add).
    De plus, avec l'ajout des import, cet ensemble fonctionnel pourra certainement aider quelqu'un d'autre.


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    import java.util.*;
    import java.util.regex.*;
     
    public class Main {
      //private static List<String> values = Arrays.asList("Maison", "Raison", "Cuivre", "Badges", "Zircon", "Saison");
      static List<String> values = new ArrayList<String>();
      static String strToSearchFor = "(.a..on)";
     
      public static void main(String[] args)
      {
        values.add("Maison");
        values.add("Raison");
        values.add("Cuivre");
        values.add("Badges");
        values.add("Zircon");
        values.add("Saison");
     
        Pattern pattern = Pattern.compile(strToSearchFor, Pattern.CASE_INSENSITIVE);
        for (String value : values)
        {
          Matcher matcher = pattern.matcher(value);
          if (matcher.find())
          {
            System.out.println(matcher.group(1) + " correspond à la recherche");
          }
        }
      }
    }

  4. #4
    Modérateur
    Avatar de OButterlin
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    7 311
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 7 311
    Points : 9 524
    Points
    9 524
    Billets dans le blog
    1
    Par défaut
    Pas de problème, vous pouvez modifier comme vous voulez

    Une petite précision (je crois comprendre que vous ne connaissez pas trop les RegExp) :

    Le pattern utilisé est entouré de parenthèses (dans "(.a..on)"), ce qui indique un groupe capturant qu'on récupère via matcher.group(1) ici.
    On n'en aurait pas besoin ici pour juste savoir si le mot est conforme à l'expression régulière, un simple matcher.find() ou matcher.matches() aurait suffit.

    Et oui, vous devriez vous intéresser aux expressions régulières, c'est super puissant... à défaut d'avoir une syntaxe lisible
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  5. #5
    Membre régulier
    Homme Profil pro
    Hobby
    Inscrit en
    Août 2002
    Messages
    125
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Hobby

    Informations forums :
    Inscription : Août 2002
    Messages : 125
    Points : 82
    Points
    82
    Par défaut
    @OButterlin
    Bien noté !
    Regex en cours de lecture...
    Encore merci.

  6. #6
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 551
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 551
    Points : 21 608
    Points
    21 608
    Par défaut
    @OButterlin Pour info, group() et group(0) permettent de récupérer le texte que la regex a repérée, sans parenthèse. Il n'est donc pas utile de mettre une regex entière entre parenthèses.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  7. #7
    Modérateur
    Avatar de OButterlin
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    7 311
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 7 311
    Points : 9 524
    Points
    9 524
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par thelvin Voir le message
    @OButterlin Pour info, group() et group(0) permettent de récupérer le texte que la regex a repérée, sans parenthèse. Il n'est donc pas utile de mettre une regex entière entre parenthèses.
    Oui, effectivement, dans ce cas précis ce n'est pas utile.
    Mais bon, les groupes capturant sont intéressants quand on cherche des sous-groupes d'une expression
    Par exemple pour les groupes de numéros dans un téléphone (format france) : ([0-9]{1,2})-([0-9]{2})-([0-9]{2})-([0-9]{2})-([0-9]{2})

    Nom : Screenshot 2024-03-07 at 21-08-18 Free Online Java Regular Expression Tester - FreeFormatter.com.png
Affichages : 32
Taille : 18,7 Ko
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

Discussions similaires

  1. [MySQL] Recherche par mots-clés et design patterns
    Par Shao17 dans le forum PHP & Base de données
    Réponses: 0
    Dernier message: 31/08/2017, 09h26
  2. [PHP 5.6] Recherche par mots-clés et design patterns
    Par Shao17 dans le forum Langage
    Réponses: 0
    Dernier message: 31/08/2017, 09h26
  3. Recherche des mots contenant ...
    Par Asdorve dans le forum Langage SQL
    Réponses: 3
    Dernier message: 18/06/2004, 10h23
  4. Réponses: 10
    Dernier message: 22/05/2004, 13h51
  5. Recherche multi-mots sur une seule colonne
    Par Badiste dans le forum Langage SQL
    Réponses: 2
    Dernier message: 31/03/2004, 11h24

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