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 :

Problème d'expression régulière


Sujet :

Langage Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Rédacteur
    Avatar de CyberChouan
    Homme Profil pro
    Directeur technique
    Inscrit en
    Janvier 2007
    Messages
    2 752
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Directeur technique
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Janvier 2007
    Messages : 2 752
    Par défaut Problème d'expression régulière
    Voici un petit problème que je n'ai pas réussi à résoudre de manière propre avec une expression régulière.

    Je veux vérifier qu'un texte contient à la fois un mot commençant par "toto", un mot commençant par "titi", et un mot commençant par "tata".

    Si ils avaient forcément été dans cet ordre, j'aurais utilisé quelque chose du genre (je schématise):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    String expr = ".+\btoto.+\btiti.+\btata.+";
    Mais voilà, ils peuvent apparaître dans n'importe quel ordre, et je voudrais vérifier qu'ils sont tous les trois présents.

    Evidemment, je peux créer 3 expressions... mais j'aimerais n'en avoir qu'une seule, pour ne pas reparcourir plusieurs fois toute la chaîne (qui est longue).

    La seule solution que j'ai trouvée en une expression est de faire des "OU" entre les 6 ordres possibles, mais je ne trouve pas cela propre (surtout si je veux passer à la recherche de 4/5 chaînes où le nombre de "OU" explose).

    Ma question est donc: existe-t'il un moyen plus élégant de faire ça (en une seule expression)?
    Avant de poster, pensez à regarder la FAQ, les tutoriaux, la Javadoc (de la JRE que vous utilisez) et à faire une recherche
    Je ne réponds pas aux questions techniques par MP: les forums sont faits pour ça
    Mes articles et tutoriaux & Mon blog informatique

  2. #2
    Membre chevronné
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    429
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 429
    Par défaut
    Bonjour,

    Une idée...
    Tu peux lui demander d'identifier dans la chaîne tous les mots commençant par "tot".
    Puis tu vérifies que, dans cette liste, tu as bien "toto...", "tata..." et "titi...".

    Nicolas

  3. #3
    Membre Expert
    Avatar de Gueritarish
    Homme Profil pro
    Développeur Java
    Inscrit en
    Mai 2007
    Messages
    1 800
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Haute Garonne (Midi Pyrénées)

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

    Informations forums :
    Inscription : Mai 2007
    Messages : 1 800
    Par défaut
    Salut,

    Une autre idée, est-ce que tu ne pourrais pas chercher dans ta chaine les mots qui commencent par : "t"[a-i-o]"t"[a-i-o].

    ++

    [EDIT] Je suis un avec cette méthode, tu reconnait les mots qui commencent par : tati, tato, tita, ...

  4. #4
    Rédacteur
    Avatar de CyberChouan
    Homme Profil pro
    Directeur technique
    Inscrit en
    Janvier 2007
    Messages
    2 752
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Directeur technique
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Janvier 2007
    Messages : 2 752
    Par défaut
    Merci, mais en fait "tata" "titi" et "toto" sont juste des exemples pour ma question. Dans la pratique, j'ai affaire à 3 (éventuellement généralisable à n) chaînes de caractères qui n'ont rien à voir entre elles, et qui n'ont pas forcément la même longueur: "azerty", "qsdfg", et "wxcvb" par exemple. Elles ne sont donc pas factorisables

    Mon problème est de vérifier si un texte contient au moins un mot commençant par chacune de ces chaînes, qui peuvent apparaître dans n'importe quel ordre.

    Je connais déjà plusieurs manières de faire ça:
    1) 3 expressions régulières, et je renvoie vrai si les trois sont trouvées dans mon texte
    2) si je veux ne parcourir mon texte qu'une seule fois, je peux développer une méthode qui parcours mon texte jusqu'à trouver une des trois chaînes, puis poursuit à la recherche des deux restantes, et dès qu'il en trouve une deuxième, il cherche la dernière.
    3) en expression régulière, il suffit de faire un "OU" entre les 6 ordres d'appartion possibles (123, 132, 213, 231, 312, 321)

    Mais comme je m'intéresse beaucoup aux expressions régulières, j'aurais voulu savoir si il existait un moyen de remplacer la méthode 2 par une jolie expression régulière qui ferait la même chose (et sans avoir à recopier 6 fois chacune de mes chaînes comme dans la méthode 3)
    Avant de poster, pensez à regarder la FAQ, les tutoriaux, la Javadoc (de la JRE que vous utilisez) et à faire une recherche
    Je ne réponds pas aux questions techniques par MP: les forums sont faits pour ça
    Mes articles et tutoriaux & Mon blog informatique

  5. #5
    Membre Expert
    Avatar de Gueritarish
    Homme Profil pro
    Développeur Java
    Inscrit en
    Mai 2007
    Messages
    1 800
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Haute Garonne (Midi Pyrénées)

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

    Informations forums :
    Inscription : Mai 2007
    Messages : 1 800
    Par défaut
    J'avais bien compris ton problème, mais je ne me doutais pas que les chaines n'étaient pas factorisables (je me doute bien que tu vas pas chercher des mots qui commencent par "tata", "titi" ou "toto" et que c'était un exemple )
    Après, désolé de pas pouvoir t'aider plus...

  6. #6
    Expert éminent
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Billets dans le blog
    1
    Par défaut
    Salut,


    Je ne sais pas s'il est possible de faire une expression simple qui remplissent tes conditions...

    Par contre tu pourrais peut-être rechercher tous les mots de ton texte et les comparer un à un avec tes prefixes. Par 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
    	public static boolean containsWordsWithPrefixes(String input, String...prefixes) {
    		// On recherche tous les mots :
    		Pattern pattern = Pattern.compile("\\p{L}+");
    		Matcher matcher = pattern.matcher(input);
     
    		// On crée une liste de préfixes :
    		List<String> prefixesList = new ArrayList<String>(Arrays.asList(prefixes));
     
    		while(matcher.find() && !prefixesList.isEmpty()) {
    			// Pour chacun des mots trouvés :
    			String word = matcher.group();
    			// On le compare à tous les prefixes de la liste
    			for (String prefix : prefixesList) {
    				if (word.startsWith(prefix)) {
    					// Et on supprime le prefix dès qu'on l'a trouvé :
    					prefixesList.remove(prefix);
    					break;
    				}
    			}
    		}
    		// Si la liste de prefixes est vide cela signifie qu'ils ont tous été trouvé :
    		return prefixesList.isEmpty();
    	}
    a++

  7. #7
    Membre chevronné
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    429
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 429
    Par défaut
    Je me rends compte que j'ai mal lu le message initial, et reformule :
    Tu peux lui demander d'identifier (en une passe) dans la chaîne tous les mots commençant par "tata", "toto" et "titi" (EDIT).
    Puis tu vérifies que, dans cette liste, tu as bien au moins un de chaque.

Discussions similaires

  1. petit problème d'expression régulière
    Par stoyak dans le forum Langage
    Réponses: 5
    Dernier message: 16/05/2006, 11h20
  2. [regexp] petit problème d'expression régulière
    Par LE NEINDRE dans le forum Langage
    Réponses: 14
    Dernier message: 16/12/2005, 10h33
  3. Problème d'expression régulière
    Par SiM07 dans le forum Langage
    Réponses: 2
    Dernier message: 02/12/2005, 17h57
  4. Problème d'expression régulière
    Par Pymm dans le forum Général JavaScript
    Réponses: 15
    Dernier message: 11/10/2005, 15h04
  5. Problème d'expression régulière
    Par Neitsa dans le forum Général Python
    Réponses: 3
    Dernier message: 11/08/2005, 14h29

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