Bonjour,
je débute en expression régulière et je souhaiterais savoir comment "matcher" une chaine qui contient tout sauf * suivit de *
Merci pour vos réponses
Bonjour,
je débute en expression régulière et je souhaiterais savoir comment "matcher" une chaine qui contient tout sauf * suivit de *
Merci pour vos réponses
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 use strict; my $ChaineInitiale = "tototititata*"; my $ChaineTrouvee = ""; if ($ChaineInitiale =~ /^(.[^*]*)\*/) { $ChaineTrouvee = $1; }
: Pourrais tu m'expliquer ton expression s'il te plait Je l'a comprend pas très bien.
Je ré-explique un peu:
"fksdj*kfdskf*fsdfjdsklf" est "matché"
"sqdfqsdfq" aussi
mais pas "dsfqdfjqsj**jhfdqjf"
Merci à tous !
Désolé pour hier et pour l'explication, je t'ai répondu à la va-vite car je me cassais du taf
En reprenant ma RegExp :
if ($ChaineInitiale =~ /^(.[^*]*)\*/)
^ -> recherche effectuée dès le début de la chaîne
(.[^*]*) -> recherche avec mémorisation (les parenthèses) d'un ou plusieurs caractères (ou zéro si non trouvé) n'étant pas un astérisque
\* -> suivi d'un astérisque (ici, on est obligé de mettre \ devant * car dans une regexp, * signifie "0 ou plusieurs caractères", or on recherche ici le caractère * en tant que tel)
C'est pas évident mais si on analyse mon blabla par une phrase, la regexp pourrait être ceci : recherche dès le début de la chaîne toute suite éventuelle de caractères n'étant pas *, suivie justement du caractère *. La chaîne trouvée (si trouvée) avant * est mémorisée et stockée dans la variable $1.
Je ne suis pas un pro des expressions régulières et celle-ci d'ailleurs n'est pas capable de matcher des chaînes du genre "toto*titi*tata*truc*pouet***titi".
Mais bon ...
Je suis pas trop d'accord:
je redefini le pattern :
n'importe quoi different de * suivit de *, ce qui donne :
[^*] permet de matcher un caractere different de * ([] permet de definir un ensemble de caractere ([1A-Z] = {1,A,B,...Z}, et le ^ permet d'inverser la selection)
[^*]* permet de "compter" les caracteres de l'ensemble, on en autorise autant que l'on veut (0->+inf), s'il en faut au moins un, il faut mettre + ([^*]+)
[^*]*\* signifie enfin l'ensemble precedent suivit du caractere * (il est protege par \, car sinon c'est l'expression precedente valable de 0 a +inf de fois)
Ce qui donne:
Maintenant, en lisant tes exemples (notamment le coups des deux etoiles), ce que tu as dis n'est pas ce que tu recherche.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 if ($string =~ /[^*]*\*/) { print STDERR " J'ai trouve le pattern : n'importe quoi different de * suivit de *\n" }
Je crois que ce que tu cherche est :
la chaine doit etre composee entierement du motif suivant : n'importe quoi different de * et non vide, suivit de *
Ce qui nous donne le pattern suivant,
[^*]+\* : n'importe quoi different de * et non vide suivit de *
il reste a voir si toute la chaine est constitue de ce motif, c'est-a-dire si ce motif peut-etre reperte (au moins 1 fois) du debut jusqu'a la fin:
^([^*]+\*)+$ : ^ permet de fixer le pattern au debut de la chaine, et $ a la fin, les parentheses servant a grouper le motif pour le + (et accessoirement a memoriser les motifs trouves).
[edit]Quoique dans ce cas, le premier exemple n'est pas valable. Specifie correctement ce que tu veux matcher. Plus c'est clair dans ta tete, plus c'est simple a ecrire[/edit]
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 if ($chaine =~ /^([^*]+\*)+$/) { print STDERR "pattern valide\n"; }
Merci à tous pour vos explications ! je m'en suis sorti ... 8)
Partager