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.