Expression regulière, j'y arrive pas...

Nico -  
kilian Messages postés 8854 Statut Modérateur -
Bonjour à tous,

J'aimerai récupérer les fichiers nommés comme ci-dessous présent dans un répertoire :

win-log.log
win-log0.log
win-log1.log
win-log2.log
....

red-log.log
red-log0.log
red-log1.log
red-log2.log
.....

J'ai créé l'espression suivante, mais sans résultat :

"^(win-|red-)log*(.log)$"

Je pensais que ça allait faire un truc comme :

qui commence par "win-" ou "red-"
suivi de la chaine de caractère "log"
suivi de rien ou quelque chose
et qui se termine par ".log"

Si quelqu'un pouvait me filer un coup de main, car je galère...

Merci beaucoup.
Nico.
A voir également:

2 réponses

lami20j Messages postés 21644 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 570
 
Salut,

^((win)|(red))-log[0-9]*\.log$
Petit complément si vous le permettez.

En fait les parenthèses on les utilise pour les captures où pour les alternatives
Dans la regex de kilian les parenthèses qui entourent les termes de l'alternative ne sont pas nécessaires.
^(win|red)-log[0-9]*\.log$
win suivi de - ou de r puis ed-lo puis 0 ou plusieurs g puis le caractère qu'on veut puis log :-)

En fait les moteurs des regex sont plutôt tenaces et persévérants mais en aucun cas intelligents.

Ils ne sauront pas trouver win mais un w suivi d'un i suivi d'un n.

Vous allez peut être dire que c'est du n'importe quoi ou que c'est pareil.
En réalité ce n'est pas pareil. Le moteur cherche d'abord en commençant avec la 1ère position dans notre cas le début de chaine.
Si jamais il n'a pas trouvé w alors il va chercher un r.
Si la correspondance échoue alors il va s'arrêter à cause de ^.
Si ^ n'existais pas il aurait recommencé à la deuxième position et ainsi de suite jusqu'à quand il aurait épuisé toutes les possibilités.
Donc il ne va jamais chercher i ou e si w ou r ne se trouve pas en début de chaine.

Dans ce cas c'est simple.
Mais dans une regex plus compliquée vous allez vous rendre compte à quel point c'est utile de lire le regex caractère par caractère.

2
Nico
 
Merci à tous.
Vous êtes de vrai champion!
0
kilian Messages postés 8854 Statut Modérateur 1 526
 
(win|red) => ah bon? Rah j'étais persuadé qu'il ne ferait le "ou" que sur le n ou le r...
0
kilian Messages postés 8854 Statut Modérateur 1 526
 
Salut,

Avec ton expression régulière on a
"^(win-|red-)log*(.log)$" 

win suivi de - ou de r puis ed-lo puis 0 ou plusieurs g puis le caractère qu'on veut puis log :-)
Ce serait plutôt:
^((win)|(red))-log[0-9]*\.log$
0