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 :

[RegExp] pattern matching adapté


Sujet :

Collection et Stream Java

  1. #1
    Membre régulier
    Inscrit en
    Novembre 2005
    Messages
    188
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 188
    Points : 106
    Points
    106
    Par défaut [RegExp] pattern matching adapté
    Bonjour,

    J'aimerais réussir à écrire un Pattern matching qui matche avec une "règle de mon fichier texte qui est sous cete forme:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    rule "rrrr"
    	xxxx
    	when
    		aaaa
                    aaaa
    	then
    		bbbb
                    bbbb
    end
    afin que je puisse pour chacune de ces règles, récupérer la valeur de rrrr, xxxx, de mes "aaaa" et "bbbb" et que ca tienne compte des retour chariots qui peuvent être sous forme windows ou linux et des éventuelles tabulations comme dans mon exemple.

    Je vous remercie :-)

  2. #2
    Expert éminent sénior Avatar de Uther
    Homme Profil pro
    Tourneur Fraiseur
    Inscrit en
    Avril 2002
    Messages
    4 570
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Tourneur Fraiseur

    Informations forums :
    Inscription : Avril 2002
    Messages : 4 570
    Points : 15 537
    Points
    15 537
    Par défaut
    Le plus simple pour ca est d'utilser \s qui regroupe aussi bien les espaces, les tabulations que les divers retours a la ligne.
    Du coup tu peux s'en tirer avec quelquechose du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    rule\s+"(.*?)"\s+(.*?)\s+when\s+((?:.*?\s+)*?)then\s+((?:.*?\s+)*?)end
    ou en plus lisible:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    (?x)
    rule \s+ "(.*?)" \s+ 
        (.*?) \s+ 
        when \s+
            ( (?: .*? \s+ )*? )
        then \s+
            ( (?: .*? \s+ )*? )
    end
    Ainsi tu récupère:
    - rrrr dans le groupe 1
    - xxxx dans le groupe 2
    - les deux aaaa dans le groupe 3
    - les deux bbbb dans le groupe 4

    Il ne te reste plus qu'a faire une nouvelle regexp plus simple pour séparer les aaaa et bbbb

  3. #3
    Membre régulier
    Inscrit en
    Novembre 2005
    Messages
    188
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 188
    Points : 106
    Points
    106
    Par défaut Re
    Re,

    Quand je mets cette ligne là, j'ai une erreur de compilation :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Pattern p = Pattern.compile("rule\s+"(.*?)"\s+(.*?)\s+when\s+((?:.*?\s+)*?)then\s+((?:.*?\s+)*?)end");
    Sinon, par rapport à la solution:

    \s+ représente un à plusieurs whitespace caractères.

    Or, j'ai quand même du texte entre mon "rule" et mon premier retour chariot, donc est-ce que cette expression est bonne ?

    Merci :-)

  4. #4
    Membre émérite
    Avatar de gifffftane
    Profil pro
    Inscrit en
    Février 2007
    Messages
    2 354
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire (Rhône Alpes)

    Informations forums :
    Inscription : Février 2007
    Messages : 2 354
    Points : 2 582
    Points
    2 582
    Par défaut
    Pour l'erreur de compilation, c'est parce qu'il faut doubler les \ ; un \ simple introduit un caractère d'échappement java, et pour obtenir un caractère \ il faut le doubler : \\.

    Pour le texte entre rule et le premier retour chariot, il me semble que la proposition de Uther en tient compte avec rule\s+"(.*?)"\s. À vérifier si ce n'est déjà fait.
    Mieux que Google, utilisez Sur Java spécialisé sur la plate-forme java !
    Pour réaliser vos applications Java dans le cadre de prestations, forfait, conseil, contactez-moi en message privé.

  5. #5
    Membre régulier
    Inscrit en
    Novembre 2005
    Messages
    188
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 188
    Points : 106
    Points
    106
    Par défaut Re
    Re,

    Je commence à comprendre.

    En fait, j'applque mon pattern sur un readLine(), ce qui fait que je lis ligne par ligne (je crois que le readLine rend la ligne sans le retour chariot), donc ca risquait pas de marcher...:-(

    Je vais mettre le contenu de tout mon fichier dans un string, je reteste, et je vous tiens au courant :-)

    Merci :-)

  6. #6
    Membre régulier
    Inscrit en
    Novembre 2005
    Messages
    188
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 188
    Points : 106
    Points
    106
    Par défaut Re
    Re,

    Ca ne marche pas mieux.

    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
    public static void initializeRules(){
            String ligne;
            FileInputStream fis = null;
            String fileName =
                "C:/projets/SwingProject/test/drl/CV.drl";
            File drlFile = new File(fileName);
     
            //Pattern p = Pattern.compile("rule(.*)\\r\\nwhen");
            //Pattern p = Pattern.compile("rule(.*)when", Pattern.DOTALL);
            //Pattern p = Pattern.compile("rule\\s+\"(.*?)\"\\s+(.*?)\\s+when\\s+((?:.*?\\s+)*?)then\\s+((?:.*?\\s+)*?)end");
            //Pattern p = Pattern.compile("rule \"(.*)\"\\s*");
            Pattern p = Pattern.compile("^rule", Pattern.MULTILINE);
            try {
                String nameRule;
                String whenRule;
                String thenRule;
                String fichier = FileUtil.readUTF8File(drlFile);
                System.out.println("fichier: "+ fichier);
                Matcher m = p.matcher(fichier);
                if (m.matches()){
                    nameRule = m.group(1);
                    //whenRule = m.group(2);
                    //thenRule = m.group(3);
                    //System.out.println("Trouvé: "+ ligne);
                    System.out.println("nameRule : "+nameRule);
                    //System.out.println("whenRule : "+whenRule);
                    //System.out.println("thenRule : "+thenRule);
                }
                else{
                    System.out.println("Ca ne matche pas ");
                }
            } catch (FileNotFoundException e) {
                // Log the error
            } catch (UnsupportedEncodingException e) {
                // Log the error
            } catch (IOException e) {
                // Log the error
            }
        }
    Même
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Pattern p = Pattern.compile("^rule", Pattern.MULTILINE);
    ne marche pas :-(

    Merci :-)

  7. #7
    Expert éminent sénior Avatar de Uther
    Homme Profil pro
    Tourneur Fraiseur
    Inscrit en
    Avril 2002
    Messages
    4 570
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Tourneur Fraiseur

    Informations forums :
    Inscription : Avril 2002
    Messages : 4 570
    Points : 15 537
    Points
    15 537
    Par défaut
    Le problème viens sans doute du fait que tu utilises m.matches() qui vérifie que l'intégralité de ton texte est conforme a la regexp.

    Si tu veux rechercher une regexp a l'interieur d'un texte, il te faut utiliser m.find();

  8. #8
    Membre régulier
    Inscrit en
    Novembre 2005
    Messages
    188
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 188
    Points : 106
    Points
    106
    Par défaut Re
    Exactement :-)

    Ca marche nikel maintenant.

    Je te remercie :-)

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

Discussions similaires

  1. Regexp sur pattern matching
    Par ifsera dans le forum Collection et Stream
    Réponses: 2
    Dernier message: 06/02/2013, 10h17
  2. Use of uninitialized value in pattern match (m//)
    Par Vladkergan dans le forum Langage
    Réponses: 4
    Dernier message: 13/01/2008, 19h25
  3. [Java][Regexp] Pattern spécial.
    Par Maya_vega dans le forum Servlets/JSP
    Réponses: 1
    Dernier message: 05/04/2007, 20h09
  4. [Regexp] pattern pour trouver des fichiers par exclusion d'extension
    Par mnementh64 dans le forum Collection et Stream
    Réponses: 1
    Dernier message: 07/09/2006, 10h34
  5. [Regexp] String.matches
    Par scifire dans le forum Collection et Stream
    Réponses: 6
    Dernier message: 21/11/2005, 17h25

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