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

Fermé
Nico - 24 nov. 2008 à 11:52
kilian Messages postés 8731 Date d'inscription vendredi 19 septembre 2003 Statut Modérateur Dernière intervention 20 août 2016 - 24 nov. 2008 à 14:21
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.

2 réponses

lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 567
24 nov. 2008 à 12:53
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
Merci à tous.
Vous êtes de vrai champion!
0
kilian Messages postés 8731 Date d'inscription vendredi 19 septembre 2003 Statut Modérateur Dernière intervention 20 août 2016 1 524
24 nov. 2008 à 14:21
(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 8731 Date d'inscription vendredi 19 septembre 2003 Statut Modérateur Dernière intervention 20 août 2016 1 524
24 nov. 2008 à 11:59
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