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

Java Discussion :

Regex sur des chaines de caratères


Sujet :

Java

  1. #1
    Membre habitué Avatar de 4rocky4
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    528
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 528
    Points : 180
    Points
    180
    Par défaut Regex sur des chaines de caratères
    Bonsoir tout le monde,

    J'ai une petite question concernant les regex sur les chaines de caratères.
    Prenons cet exemple :
    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
    29
    30
    31
    32
    33
    public class TestRegex {
    	public static void Matcher(String mot, String motTableau){
     
    		Pattern pattern;
    		Matcher matcher;
    		pattern = Pattern.compile(mot);
    		matcher = pattern.matcher(motTableau);
     
    		if(matcher.find()){
    			System.out.println(mot+" : "+motTableau);
    		}
    	}
     
            public static void main(String[] args){
                   	String [] tableau = new String[3];
    		tableau[0] = "maison";
    		tableau[1] = "le";
    		tableau[2] = "elle";
     
    		String mot = "maisons";
    		String mot2 = "elle";
     
    		for(int i =0; i < tableau.length; i++) {
    			String motTableau = tableau[i];
    			Matcher(mot,motTableau);			
    		}
     
    		for(int i =0; i < tableau.length; i++) {
    			String motTableau = tableau[i];
    			Matcher(mot2,motTableau);			
    		}
            }
    }
    Cela va me renvoyer :
    elle : elle
    et la String "maisons" ne sera pas trouvée.

    Si on inverse mot et motTableau dans la procédure Matcher
    public static void Matcher(String motTableau, String mot)

    le résultat sera :
    maison : maisons
    le : elle
    elle : elle


    La String "maisons" est trouvée comme on le souhaite, la String "elle" est également trouvée. Cependant "elle" a aussi matcher sur "le".

    Comment peut-on faire pour que "elle" ne match pas sur "le" dans cette situation ?

  2. #2
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 557
    Points : 21 616
    Points
    21 616
    Par défaut
    Citation Envoyé par 4rocky4 Voir le message
    Si on inverse mot et motTableau dans la procédure Matcher
    Dans ce cas-là ce qui était censé être le pattern devient la séquence sur laquelle on cherche le pattern, et vice-versa.
    Ce n'est pas interchangeable.

  3. #3
    Membre habitué Avatar de 4rocky4
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    528
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 528
    Points : 180
    Points
    180
    Par défaut
    Citation Envoyé par thelvin Voir le message
    Dans ce cas-là ce qui était censé être le pattern devient la séquence sur laquelle on cherche le pattern, et vice-versa.
    Ce n'est pas interchangeable.
    Oui c'est vrai.

    Et sinon, comment je peux mettre en place ce que je souhaite faire ?

  4. #4
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 557
    Points : 21 616
    Points
    21 616
    Par défaut
    ... Ça dépend de ce que tu veux faire. Je suis désolé, je trouve pas que ce soit particulièrement évident, vu l'exemple.

  5. #5
    Membre habitué Avatar de 4rocky4
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    528
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 528
    Points : 180
    Points
    180
    Par défaut
    je voudrai matcher uniquement avec le mot qui s'en rapproche le plus.
    Je sais que c'est pas évident, j'y suis depuis hier soir dessus
    J'ai posté car je pensais que quelqu'un me ferait découvrir une astuce pour ça

  6. #6
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 557
    Points : 21 616
    Points
    21 616
    Par défaut
    Il n'existe pas de notion algorithmique universelle telle que "choisir dans un ensemble de strings, laquelle se rapproche le plus d'une string précise."
    Les regex ne sont pas une logique floue comme celle-ci, ce sont de purs automates mathématiques.

    Java n'inclut pas de notion comme celle décrite au-dessus.

    À la rigueur, tu pourrais te baser sur la distance de Levenshtein entre deux Strings, et te dire que si deux strings ont la même distance de Levenshtein vers une autre, elles sont toutes les deux aussi proches d'elle.
    Java n'inclut pas la distance de Levenshtein, mais tu trouveras plein de trucs sur Google.

  7. #7
    Membre régulier
    Homme Profil pro
    Développeur Java
    Inscrit en
    Avril 2011
    Messages
    65
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Avril 2011
    Messages : 65
    Points : 88
    Points
    88
    Par défaut Distance de Levenstein
    En effet c'est faisable avec la distance de LevenStein, et l'algorithme pour calculer une distance de Levenstein est disponible sur wikipédia. Tu calcules cette distance pour chaque mot qui match avec ton pattern, tu prends la plus petite, et tu as le mot correspondant qui sera celui le plus proche de ton pattern. Si jamais tu t'amuses à calculer la distance de Levenstein, je te conseille de partir sur un algo dynamique, ça aidera à la fois côté mémoire et côté performances si tu as un grand nombres de données.

  8. #8
    Membre habitué Avatar de 4rocky4
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    528
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 528
    Points : 180
    Points
    180
    Par défaut
    Effectivement j'ai pu me débrouiller avec Levenshtein. Merci

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

Discussions similaires

  1. Réponses: 7
    Dernier message: 15/07/2011, 05h35
  2. [sql server2000]operation sur des chaines
    Par graphicsxp dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 26/05/2006, 15h58
  3. probleme d'heritage sur des chaines de caracteres
    Par pikiwiki dans le forum C++
    Réponses: 3
    Dernier message: 24/05/2006, 21h01
  4. incrémenter des chaines de caratères
    Par stan21 dans le forum Access
    Réponses: 6
    Dernier message: 22/02/2006, 14h19
  5. Convertir des chaines de caratères en chiffres
    Par Mr Hyde dans le forum Général Python
    Réponses: 1
    Dernier message: 06/09/2005, 15h18

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