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

Collection et Stream Java Discussion :

[Pattern] Des expressions qui ne jouent pas à la régulière!


Sujet :

Collection et Stream Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    61
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 61
    Par défaut [Pattern] Des expressions qui ne jouent pas à la régulière!
    Bonjour,

    j'ai un problème avec les expressions régulières en Java... Normalement, j'ai l'habitude de les utiliser ailleurs mais là, je bloque complètement! J'ai regardé le tutorial de cyberzoide, je pense l'avoir compris mais je n'y arrive pas!

    Alors voici le texte que j'étudie:
    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
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
     
    Un exemple illustrera chaque définition.
     
     
     
    <--1 Debut de la table des charges de travail par mois-->
    420
    415
    355
    345
    160
    95
    380
    395
    270
    230
    310
    420
    <--Fin de la table des charges de travail par mois-->
     
    Exemple:
    420
    415
    355
    345
    160
    95
    380
    395
    270
    230
    310
    420
     
    Chaque ligne correspond à un mois, Janvier pour la première, Décembre pour la dernière.
     
     
     
    <--2 Debut de la table des temps de travail estime par mois et par type d'elevage-->
    1.4	1.8	1.5	1.4	1.4
    9.8	2.4	1.4	1.4	1.4
    4.0 0.4 1.4 1.4 1.4
    2.8 0.6 1.3 1.4 1.5
    2.2 0.4 1.3 1.5 1.2
    2.2 0.4 1.3 1.3 1.2
    2.2 0.6 1.3 1.3 1.2
    2.6 5.8 1.5 1.5 1.2
    0.6 4.0 1.3 0		0
    0.6 1.2 1.3 1.3 2.6
    0.6 1.8 1.2 1.2 1.2
    0.6 1.8 1.5 1.4 1.4
    <--Fin de la table des temps de travail estime par mois et par type d'elevage-->
     
    Exemple:
    1.4	1.8	1.5	1.4	1.4
    9.8	2.4	1.4	1.4	1.4
    4.0 0.4 1.4 1.4 1.4
    2.8 0.6 1.3 1.4 1.5
    2.2 0.4 1.3 1.5 1.2
    2.2 0.4 1.3 1.3 1.2
    2.2 0.6 1.3 1.3 1.2
    2.6 5.8 1.5 1.5 1.2
    0.6 4.0 1.3 0		0
    0.6 1.2 1.3 1.3 2.6
    0.6 1.8 1.2 1.2 1.2
    0.6 1.8 1.5 1.4 1.4
     
    Chaque ligne correspond à un mois et chaque colonne à un type d'élevage.
    Dans ce texte, je veux d'abord extraire ce qu'il y a entre les balises, leur ordre n'est pas forcément là. Pour cela, j'utilise les expressions suivantes:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    private Pattern patternChargeTravail = Pattern.compile("<--1.Debut.*?-->(.+?)<--Fin",Pattern.MULTILINE);
    private Pattern patternTempsEstime = Pattern.compile("<--2.Debut.*?-->(.+?)<--Fin",Pattern.MULTILINE);
    Et ensuite, avec les données capturées par le "(.+?)", je veux capturer chaque valeur numérique. Comme ces valeurs ont un format prédéfini, j'utilise les expressions suivantes:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    private Pattern patternChargeTravailV = Pattern.compile("(^\\s*(\\d+)\\s*$){12}",Pattern.MULTILINE);
    private Pattern patternTempsEstimeV = Pattern.compile("(^(\\s*(\\d+)\\s*){5}$){12}",Pattern.MULTILINE);
    Le problème, c'est qu'avec mon code, je n'arrive pas à matcher mes balises
    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
     
    	public void buildChargeTravail()
    	{
    		matcherBalise = patternChargeTravail.matcher(texteBrut.toString());
    		if (!matcherBalise.find(0)){
    			System.err.println("Donnees sur la charge de travail non trouvees!");
    			System.exit(2);
    		}
    		System.out.println(matcherBalise.group());
    		matcherValeurs = patternChargeTravailV.matcher(matcherBalise.group());
    		if (!matcherValeurs.find(0)){
    			System.err.println("Donnees sur la charge de travail mal écrites!");
    			System.exit(3);
    		}
    		tableChargeTravail = new float[12];
    		System.out.println("CdT: "+matcherValeurs.group());
    	}
    Je ne sais pas pourquoi je n'arrive pas à matcher ce que je veux... et c'est pour ça que je demande votre aide.

    Merci d'avance, c'est assez urgent (enfin, j'ai encore une semaine mais je veux de la marge pour finaliser le reste, c'est la partie la plus simple de mon projet).

  2. #2
    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 n'ai pas tout regarder en détails, mais tu devrais remplacer :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    "<--1.Debut*?-->(.+?)<--Fin"
    par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    "<--1.Debut.*?-->(.+?)<--Fin"
    En effet sinon t*? signifie "zéro, un ou plusieurs fois la lettre 't'"...

    a++

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    61
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 61
    Par défaut J'ai essayé
    Salut!
    J'ai ajouté les "." mais les balises ne sont toujours pas matchées... en fait, il faut ajouter le flag DOTALL pour que le point puisse pouvoir prendre la valeur d'un retour à la ligne.

    Pour la deuxième expression régulière, il faut utiliser en plus MULTILINE qui permet à "^" et "$" d'avoir plusieurs valeurs, c'est à dire prendre effet à chaque ligne et pas en début et fin de texte.

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

Discussions similaires

  1. Des panel qui ne changent pas de couleur
    Par richard038 dans le forum Composants VCL
    Réponses: 7
    Dernier message: 24/03/2006, 09h37
  2. Interdire des navigateur qui ne sont pas a jour ?
    Par allpicI2c dans le forum Général Conception Web
    Réponses: 5
    Dernier message: 28/01/2006, 18h30
  3. UNION ? des lignes qui ne sont pas prises...
    Par fred23195 dans le forum Langage SQL
    Réponses: 3
    Dernier message: 01/12/2005, 14h50
  4. [XSL][re] Ecrire des balise qui ne seront pas interpretées
    Par FrRoulio dans le forum XSL/XSLT/XPATH
    Réponses: 8
    Dernier message: 17/03/2004, 12h32
  5. la liste des clients qui n'ont pas acheter aucun article ...
    Par TéBeSsI dans le forum Langage SQL
    Réponses: 6
    Dernier message: 13/02/2004, 14h57

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