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 :

[Expressions Régulières] Recherche de blocs dans un fichier de configuration.


Sujet :

Collection et Stream Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Décembre 2005
    Messages
    58
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 58
    Par défaut [Expressions Régulières] Recherche de blocs dans un fichier de configuration.
    Bonjour je travaille sur le parseur d'un fichier DHCP (dhcp.conf)
    Le but est d'extraire des blocs de données.

    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
    34
    35
    36
    37
     
    shared-network sharedTest {
     
    subnet 192.168.7.0 netmask 255.255.255.0 {
     
    host shHost1 {
    hardware ethernet 00:30:V6:S4:78:43;
    fixed-address 192.168.0.8;
    option host-name "fw2";
    }
     
    }Fin subnet n°1
     
    subnet 192.168.8.0 netmask 255.255.255.0 {
     
     
    host shHost2 {
    hardware ethernet 00:30:V6:S4:78:44;
    fixed-address 192.168.0.7;
    option host-name "fw3";
    }
     
    host shHost3 {
    hardware ethernet 00:30:V6:S4:78:44;
    fixed-address 192.168.0.7;
    option host-name "fw3";
    }
     
    host shHost4 {
    hardware ethernet 00:30:V6:S4:78:44;
    fixed-address 192.168.0.7;
    option host-name "fw3";
    }
     
    }// Fin Subnet n°2
     
    }//Fin sharedNetwork
    Dans cet exemple je cherche a extraire les blocs subnets qui contiennent eux meme des blocs host.
    Je souhaite recupérer :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    subnet 192.168.7.0 netmask 255.255.255.0 {
     
    host shHost1 {
    hardware ethernet 00:30:V6:S4:78:43;
    fixed-address 192.168.0.8;
    option host-name "fw2";
    }
     
    }//Fin subnet n°1
    et :
    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
     
    subnet 192.168.8.0 netmask 255.255.255.0 {
     
    host shHost2 {
    hardware ethernet 00:30:V6:S4:78:44;
    fixed-address 192.168.0.7;
    option host-name "fw3";
    }
     
    host shHost3 {
    hardware ethernet 00:30:V6:S4:78:44;
    fixed-address 192.168.0.7;
    option host-name "fw3";
    }
     
    host shHost4 {
    hardware ethernet 00:30:V6:S4:78:44;
    fixed-address 192.168.0.7;
    option host-name "fw3";
    }
     
    }// Fin Subnet n°2
    Pour cela je travaille avec les regEx
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    String regEx = "[\\s]*subnet\\s+.*\\s+[{][^{][^}]*[}]";
     
    Pattern modele0 = Pattern.compile(regEx);
    Matcher correspondanceRegex = modele0.matcher(blocSharedNetwork);
     
    while(correspondanceRegex.find()){
    String blocSubnet =correspondanceRegex.group();
     
    System.out.println(blocSubnet+"\n-----------");
    }
    Resultat du OUT :

    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
     
    subnet 192.168.7.0 netmask 255.255.255.0 {
    host shHost1 {
    hardware ethernet 00:30:V6:S4:78:43;
    fixed-address 192.168.0.8;
    option host-name "fw2";
    }
    -----------
    subnet 192.168.8.0 netmask 255.255.255.0 {
     
     
    host shHost3 {
    hardware ethernet 00:30:V6:S4:78:44;
    fixed-address 192.168.0.7;
    option host-name "fw3";
    }
    -----------
    Voila le problème, je ne recupere que le premier sous bloc host contenu dans le bloc subnet et pas l'ensemble des sous blocs host.
    Je pensais faire un compteur d'accolades pour récupérer la derniere accolade fermante mais je voulais savoir s'il nétait pas possible de gérer ca avec des expressions régulières directement.

  2. #2
    Expert confirmé
    Avatar de le y@m's
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2005
    Messages
    2 636
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Février 2005
    Messages : 2 636
    Par défaut
    L'expression régulière
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    String regex = "subnet.*\\{\\s*host\\s*[^\\{\\}]*\\s*\\{(.*\\s?)*?\\}\\s*\\}";
    semble marcher, après il est peut-être possible de l'optimiser.
    Je ne répondrai à aucune question technique par MP.

    Pensez aux Tutoriels et aux FAQs avant de poster ;) (pour le java il y a aussi JavaSearch), n'oubliez pas non plus la fonction Rechercher.
    Enfin, quand une solution a été trouvée à votre problème
    pensez au tag :resolu:

    Cours Dvp : http://ydisanto.developpez.com
    Blog : http://yann-disanto.blogspot.com/
    Page perso : http://yann-disanto.fr

  3. #3
    Membre confirmé
    Inscrit en
    Décembre 2005
    Messages
    58
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 58
    Par défaut
    Citation Envoyé par le y@m's
    L'expression régulière
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    String regex = "subnet.*\\{\\s*host\\s*[^\\{\\}]*\\s*\\{(.*\\s?)*?\\}\\s*\\}";
    semble marcher, après il est peut-être possible de l'optimiser.
    Ok ca marche ce que tu as proposé mais le souci c'est qu'il peut y avoir dautre type de sous blocs dans mon subnet à savoir des sous blocs pool et zones en plus de host.

    Le truc c'est donc de bien récupérer l'intégralité de ce qu'il y a dans le bloc subnet, donc bien récupérer la dernière accolade fermante correspondant à l'accolade ouvrante du subnet.

    Exemple possible :

    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
     
    shared-network sharedTest {
     
    subnet 192.168.7.0 netmask 255.255.255.0 {
    host shHost1 {
    hardware ethernet 00:30:V6:S4:78:43;
    fixed-address 192.168.0.8;
    option host-name "fw2";
    }
     
    zone "0.168.192.in-addr.arpeeea" {
    primary 192.168.0.1;
    key "ma clef" ; 
    }
     
    pool {
     
      failover peer "dhcp";
      deny dynamic bootp clients;
      range 192.168.0.253 192.168.0.254;
     
     
      host srvmail {
        hardware ethernet AA:BB:CC:DD:EE:FF ;
       fixed-address 192.168.0.252 ;
      }
    }
    }//Fin Subnet n°1
     
    subnet 192.168.8.0 netmask 255.255.255.0 {
     
     
    host shHost3 {
    hardware ethernet 00:30:V6:S4:78:44;
    fixed-address 192.168.0.7;
    option host-name "fw3";
    }
     
    host shHost33 {
    hardware ethernet 00:30:V6:S4:78:44;
    fixed-address 192.168.0.7;
    option host-name "fw3";
    }
     
    host shHost333 {
    hardware ethernet 00:30:V6:S4:78:44;
    fixed-address 192.168.0.7;
    option host-name "fw3";
    }
     
    }//Fin Subnet n°2
    }//Fin Shared Network

  4. #4
    Expert confirmé
    Avatar de le y@m's
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2005
    Messages
    2 636
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Février 2005
    Messages : 2 636
    Par défaut
    Alors tu as deux solutions :
    Je ne répondrai à aucune question technique par MP.

    Pensez aux Tutoriels et aux FAQs avant de poster ;) (pour le java il y a aussi JavaSearch), n'oubliez pas non plus la fonction Rechercher.
    Enfin, quand une solution a été trouvée à votre problème
    pensez au tag :resolu:

    Cours Dvp : http://ydisanto.developpez.com
    Blog : http://yann-disanto.blogspot.com/
    Page perso : http://yann-disanto.fr

  5. #5
    Membre confirmé
    Inscrit en
    Décembre 2005
    Messages
    58
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 58
    Par défaut
    Citation Envoyé par le y@m's
    Alors tu as deux solutions :
    1er probleme :
    Ok j'avais remplacé "host" par "\\w+" :
    Ca marche pour la zone.
    Mais le probleme c'est qu'un pool n'est pas formé de la même manière qu'une zone et qu'un host ( zone nomZone {} , host nomHost{} alors que pool -> pool {} )
    Ce probleme ets encore gérable en modifiant la regex.

    Le second probleme est par contre plus important car comme tu le vois dans l'exemple mon pool qui est contenu dans mon subnet contient lui meme (pool) un host ce qui n'est pas géré par notre regEx.

    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
     
    subnet 192.168.7.0 netmask 255.255.255.0 {
    host shHost1 {
    hardware ethernet 00:30:V6:S4:78:43;
    fixed-address 192.168.0.8;
    option host-name "fw2";
    }
     
    zone "0.168.192.in-addr.arpeeea" {
    primary 192.168.0.1;
    key "ma clef" ; 
    }
     
    pool {
     
      failover peer "dhcp";
      deny dynamic bootp clients;
      range 192.168.0.253 192.168.0.254;
     
     
      host srvmail {
        hardware ethernet AA:BB:CC:DD:EE:FF ;
       fixed-address 192.168.0.252 ;
      }
    }
    }//Fin Subnet n°1

  6. #6
    Expert confirmé
    Avatar de le y@m's
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2005
    Messages
    2 636
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Février 2005
    Messages : 2 636
    Par défaut
    Je ne vois pas trop le problème. Si on traite le texte
    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
    shared-network sharedTest {
     
    subnet 192.168.7.0 netmask 255.255.255.0 {
    host shHost1 {
    hardware ethernet 00:30:V6:S4:78:43;
    fixed-address 192.168.0.8;
    option host-name "fw2";
    }
     
    zone "0.168.192.in-addr.arpeeea" {
    primary 192.168.0.1;
    key "ma clef" ; 
    }
     
    pool {
     
      failover peer "dhcp";
      deny dynamic bootp clients;
      range 192.168.0.253 192.168.0.254;
     
     
      host srvmail {
        hardware ethernet AA:BB:CC:DD:EE:FF ;
       fixed-address 192.168.0.252 ;
      }
    }
    }//Fin Subnet n°1
     
    subnet 192.168.8.0 netmask 255.255.255.0 {
     
     
    host shHost3 {
    hardware ethernet 00:30:V6:S4:78:44;
    fixed-address 192.168.0.7;
    option host-name "fw3";
    }
     
    host shHost33 {
    hardware ethernet 00:30:V6:S4:78:44;
    fixed-address 192.168.0.7;
    option host-name "fw3";
    }
     
    host shHost333 {
    hardware ethernet 00:30:V6:S4:78:44;
    fixed-address 192.168.0.7;
    option host-name "fw3";
    }
     
    }//Fin Subnet n°2
    }//Fin Shared Network
    Avec l'expression régulière
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    String regex = "subnet.*\\{\\s*\\w+\\s*[^\\{\\}]*\\s*\\{(.*\\s?)*?\\}\\s*\\}";
    On ce retrouve avec 2 groupes "subnet" :
    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
    subnet 192.168.7.0 netmask 255.255.255.0 {
    host shHost1 {
    hardware ethernet 00:30:V6:S4:78:43;
    fixed-address 192.168.0.8;
    option host-name "fw2";
    }
     
    zone "0.168.192.in-addr.arpeeea" {
    primary 192.168.0.1;
    key "ma clef" ; 
    }
     
    pool {
     
      failover peer "dhcp";
      deny dynamic bootp clients;
      range 192.168.0.253 192.168.0.254;
     
     
      host srvmail {
        hardware ethernet AA:BB:CC:DD:EE:FF ;
       fixed-address 192.168.0.252 ;
      }
    }
    }
    et
    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
    subnet 192.168.8.0 netmask 255.255.255.0 {
     
     
    host shHost3 {
    hardware ethernet 00:30:V6:S4:78:44;
    fixed-address 192.168.0.7;
    option host-name "fw3";
    }
     
    host shHost33 {
    hardware ethernet 00:30:V6:S4:78:44;
    fixed-address 192.168.0.7;
    option host-name "fw3";
    }
     
    host shHost333 {
    hardware ethernet 00:30:V6:S4:78:44;
    fixed-address 192.168.0.7;
    option host-name "fw3";
    }
     
    }
    ensuite tu peux travailler sur chaque "subnet" pour en sortir les "host", "zone" et "pool" et ensuite pour chaque "pool" extraire les "host".
    Je ne répondrai à aucune question technique par MP.

    Pensez aux Tutoriels et aux FAQs avant de poster ;) (pour le java il y a aussi JavaSearch), n'oubliez pas non plus la fonction Rechercher.
    Enfin, quand une solution a été trouvée à votre problème
    pensez au tag :resolu:

    Cours Dvp : http://ydisanto.developpez.com
    Blog : http://yann-disanto.blogspot.com/
    Page perso : http://yann-disanto.fr

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

Discussions similaires

  1. Réponses: 4
    Dernier message: 26/05/2011, 22h50
  2. Réponses: 3
    Dernier message: 17/04/2011, 11h42
  3. expression régulière (Recherche dans fichier)
    Par Mirel dans le forum Langage
    Réponses: 4
    Dernier message: 16/04/2009, 14h13
  4. Expression régulière recherche de fichier
    Par david71 dans le forum Collection et Stream
    Réponses: 3
    Dernier message: 12/09/2008, 12h53
  5. recherche de doublons dans un fichier texte
    Par portu dans le forum Algorithmes et structures de données
    Réponses: 3
    Dernier message: 07/10/2003, 14h13

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