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 :

petit probleme à base de regexp


Sujet :

Langage Java

  1. #1
    Membre du Club
    Inscrit en
    Octobre 2005
    Messages
    86
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 86
    Points : 49
    Points
    49
    Par défaut petit probleme à base de regexp
    Salut à tous,

    Voila, j'ai une String source, de la forme :

    (debut)...AAA...AAA...AAA...BBB...CCC...CCC...(fin)

    AAA,BBB,CCC sont de même motif. Je souhaite en extraire un vecteur contenant .... voir ci dessous (pas facile à ecrire) :


    (debut)...AAA...AAA...AAA...BBB...CCC...CCC...(fin)
    ...............| oui |..................| oui. | oui. |...............

    En gros, je veux le contenu entre le debut d'un motif et le debut du suivant, mais uniquement pour la première occurence.

    Et là je me fais des noeuds au cerveau ;-)
    Merci de votre aide

  2. #2
    Membre régulier Avatar de Vesperal
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    81
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 81
    Points : 81
    Points
    81
    Par défaut
    Si tu connais la longueur du motif, il sufit de faire un parcours de chaîne.
    Quelque chose du genre :

    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
     
     
    String ta_chaine;
    char last_char;    // le dernier caractère que tu as lu
    int nb=0;            // le nombre de fois ou tu l'as lu
    int longeur;         // la longeur de ton schéma de chaîne (3 pour AAA par ex)
    String schema="";
     
    Vector<String> resultat=new Vector<String>();
     
    for (int i=0;i<ta_chaine.length;i++) {
     
          if (ta_chaine.charAt(i)==last_char && nb<longeur) {
                 longeur++;
                 schema+=last_char;
          }
          else if (ta_chaine.charAt(i)==last_char && nb==longeur) {
                 v.add(schema);
          }
          else if (ta_chaine.charAt(i)==last_char) {
                 schema="";
                 nb=0;
                 last_char=ta_chaine.charAt(i);
          }
     
    }
     
    return v;
    C'est peut-être pas optimisé, mais ca devrait marcher

  3. #3
    Membre du Club
    Inscrit en
    Octobre 2005
    Messages
    86
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 86
    Points : 49
    Points
    49
    Par défaut
    Salut, et merci de ta réponse c'est sympa d'y avoir consacré du temps.

    Malheureusement, la longueur de mon motif est variable....

  4. #4
    Membre régulier Avatar de Vesperal
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    81
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 81
    Points : 81
    Points
    81
    Par défaut
    Variable, c'est à dire ? Variable au sein de la même chaîne, ou variable de manière générale ? Si c'est de manière générale, il suffit de changer la valeur de "longeur".

    Si tu es un peu plus précis je pourrais remodifier le code en fonction

  5. #5
    Membre du Club
    Inscrit en
    Octobre 2005
    Messages
    86
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 86
    Points : 49
    Points
    49
    Par défaut
    ç'est à dire que dans ma chaine, un coup c'est AAAAA, puis BB, puis CCCCCC....mais pour tous les trois c'est le même Pattern de base

  6. #6
    Membre du Club
    Inscrit en
    Octobre 2005
    Messages
    86
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 86
    Points : 49
    Points
    49
    Par défaut
    Je vais essayer d'être plus précis :


    String source=".............AB123 aaaaa AB123 bb CD12 cccc DE4567 zzzzz DE4567 yyyyyyy.......";

    String motif = "[A-Z]{2}[0-9]+" ; //2 lettres majuscules suivies de 1 ou plusieurs chiffres

    Pattern regex=Pattern.compile(motif);
    Matcher result=regex.matcher(source);

    Je souhaite en retour :
    AB123 aaaaa
    CD12 cccc
    DE4567 zzzzz

  7. #7
    Membre régulier Avatar de Vesperal
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    81
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 81
    Points : 81
    Points
    81
    Par défaut
    Je saisis mieux.
    Après un peu de navigation dans l'API, il semblerait que tu puisses faire quelque chose comme :

    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
    34
     
     
    String source=".............AB123 aaaaa AB123 bb CD12 cccc DE4567 zzzzz DE4567 yyyyyyy......."; 
     
    String motif = "[A-Z]{2}[0-9]+" ; //2 lettres majuscules suivies de 1 ou plusieurs chiffres 
     
    Pattern regex=Pattern.compile(motif); 
    Matcher result=regex.matcher(source); 
     
    Vector<String[]> vec=new Vector<String[]>();
     
    String[] res;
     
    boolean trouve=result.find();        // find() cherche la prochaine chaîne qui match et retourne vrai s'il en a                                                                                  //trouvé une
    int deb=result.start();               // start() renvoie l'indice de débût de la dernière chaîne ayant matché
     
    while (trouve) {                                             
       res=new String[2];
     
    	res[0]=result.group();                         	 // group() renvoie la dernière chaîne à avoir matché
     
    	int fin_match=deb+res[0].length();
     
    	trouve=result.find();
    	if (trouve) {
    		deb=result.start();		// Tu récupères l'indice de la prochaine chaîne qui match
    	}
     
    	res[1]=source.substring(fin_match+1,deb-1) // Tu récupères la chaine qui se trouve entre la fin du dernier 
                                                   //match et le prochain.
     
     
    	vec.add(res);
    }
    Il faudra juste que tu vérifies les indexs que prends la fonction subString(). Il te faudra peut-être décaler de 1 à cause des indices du tableau commenceant en 0.

    J'ai mis dans ton vecteur des tableaux avec en 0 la chaîne à matcher, et en 1 la chaîne suivante. Ca te va ?

  8. #8
    Membre du Club
    Inscrit en
    Octobre 2005
    Messages
    86
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 86
    Points : 49
    Points
    49
    Par défaut
    Yop! Désolé Vesperal, mais je ne suis toujours pas content .
    Parce que là, sauf erreur, ton code ne va pas zapper ce que je veux.

    Si je reprends mon exemple,

    "...AB123 aaaaa AB123 bb CD12 cccc DE4567 zzzzz DE4567 yyyyyyy......."


    ça va renvoyer:

    AB123 / aaaaa
    AB123 / bb
    CD12 / cccc
    DE4567/ zzzzz
    DE4567/ yyyyyy

    alors que je ne voudrais que çà:
    AB123 / aaaaa
    CD12 / cccc
    DE4567 / zzzzz

    Grand merci pour on aide en tous cas

  9. #9
    Membre régulier Avatar de Vesperal
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    81
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 81
    Points : 81
    Points
    81
    Par défaut
    Pas de problème. Pour zapper la deuxième fois que la chaîne apparaît, il suffit de tester en gardant la dernière chaine à avoir matché, du genre :

    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
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
     
     
          String source=".............AB123 aaaaa AB123 bb CD12 cccc DE4567 zzzzz DE4567 yyyyyyy......."; 
     
    		String motif = "[A-Z]{2}[0-9]+" ; //2 lettres majuscules suivies de 1 ou plusieurs chiffres 
     
    		Pattern regex=Pattern.compile(motif); 
    		Matcher result=regex.matcher(source); 
     
    		Vector<String[]> vec=new Vector<String[]>();
     
    		String[] res;
     
    		String last_match="";   // variable qui va contenir le dernier match trouvé
    		boolean trouve=result.find();      // find() cherche la prochaine chaîne qui match et retourne vrai s'il en a                                                                                  //trouvé une
    		int deb=result.start();   
    		// start() renvoie l'indice de débût de la dernière chaîne ayant matché
     
    		while (trouve) {                                             
    			res=new String[2];
     
     
    			res[0]=result.group();	// group() renvoie la dernière chaîne à avoir matché
    			if (res[0].equals(last_match)) {    // Si c'est la même chaîne, on passe à la suivante
    				trouve=result.find();
    				if (trouve) {
    					deb=result.start();
    				}
    			}
    			else {                                 // Sinon on ajoute au vecteur comme prévu
    				int fin_match=deb+res[0].length();
     
    				trouve=result.find();
    				if (trouve) {
    					deb=result.start();		// Tu récupères l'indice de la prochaine chaîne qui match
    				}
     
    				res[1]=source.substring(fin_match+1,deb-1); // Tu récupères la chaine qui se trouve entre la fin du
    				                                                // dernier match et le prochain.
     
     
    				vec.add(res);
    			}
    		}
    Ca te va ?

  10. #10
    Membre du Club
    Inscrit en
    Octobre 2005
    Messages
    86
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 86
    Points : 49
    Points
    49
    Par défaut
    Hello !

    Y'a quelques petites modifs à faire, mais l'idée est là. Merci une fois encore.

    a+

  11. #11
    Membre régulier Avatar de Vesperal
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    81
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 81
    Points : 81
    Points
    81
    Par défaut
    Aucun problème.

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

Discussions similaires

  1. Petit probleme avec ma base de donnée
    Par lejujudu59 dans le forum Visual C++
    Réponses: 1
    Dernier message: 18/09/2007, 10h06
  2. Petit problème de fork
    Par osmose22 dans le forum Linux
    Réponses: 7
    Dernier message: 18/03/2007, 21h10
  3. petit probleme avec l'éditeur de builder
    Par qZheneton dans le forum C++Builder
    Réponses: 2
    Dernier message: 28/10/2004, 16h19
  4. petit probleme de requete
    Par nico33307 dans le forum Décisions SGBD
    Réponses: 2
    Dernier message: 25/08/2004, 11h36
  5. petit probleme dans une requte POSTGRE SQL
    Par ghis le fou dans le forum Requêtes
    Réponses: 5
    Dernier message: 08/09/2003, 13h51

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