OVH Cloud OVH Cloud

probleme de regex

13 réponses
Avatar
GERBIER Eric
bonjour

je cherche a faire une regex qui correspond
- soit a des noms de fichiers ne contenant aucun espace : /tmp/toto
- soit a une chaine contenant eventuellement des espaces, mais entouree de
quotes : "un nom avec des espaces"

le code suivant marche :
#################################
sub test_file($) {
my $ligne = shift(@_);

if ($ligne =~ m/\"(.*)\"/) {
print "\!$ligne\! trouvé motif avec quotes : $1\n";
} elsif ($ligne =~ m/(\S+)/ ) {
print "\!$ligne\! trouvé motif : $1\n";
}
}

test_file('"un fichier"');
test_file('/un/autre');
#####################################

mais maintenant, j'aurais voulu tout regrouper dans un seul test , avec un |
############################################
sub test_file($) {
if ($ligne =~ m/\"(.*)\"|(\S+)/) {
print "test 2 \!$ligne\! trouvé motif : $1\n";
}
}
#########################################
mais ca ne marche pas :

test 2 !"un fichier"! trouvé motif : un fichier
Use of uninitialized value in concatenation (.) or string at ./essai.pl line 20.
test 2 !/un/autre! trouvé motif :

10 réponses

1 2
Avatar
Jack
Le 22/10/2004 10:36, :
bonjour

je cherche a faire une regex qui correspond
- soit a des noms de fichiers ne contenant aucun espace : /tmp/toto
- soit a une chaine contenant eventuellement des espaces, mais entouree de
quotes : "un nom avec des espaces"

le code suivant marche :
#################################
sub test_file($) {
my $ligne = shift(@_);

if ($ligne =~ m/"(.*)"/) {
print "!$ligne! trouvé motif avec quotes : $1n";
} elsif ($ligne =~ m/(S+)/ ) {
print "!$ligne! trouvé motif : $1n";
}
}

test_file('"un fichier"');
test_file('/un/autre');
#####################################

mais maintenant, j'aurais voulu tout regrouper dans un seul test , avec un |
############################################
sub test_file($) {
if ($ligne =~ m/"(.*)"|(S+)/) {
print "test 2 !$ligne! trouvé motif : $1n";
}
}
#########################################
mais ca ne marche pas :

test 2 !"un fichier"! trouvé motif : un fichier
Use of uninitialized value in concatenation (.) or string at ./essai.pl line 20.
test 2 !/un/autre! trouvé motif :


Parenthèses?

Avatar
Jean-Philippe Caruana
if ($ligne =~ m/"(.*)"|(S+)/)


essaye avec des paratheses :


m/("(.*)")|((S+))/
^ ^ ^ ^

comme ca, ca fonctionne ?

--
jpc
http://www.enstimac.fr/~caruana/

Avatar
Jack
Le 22/10/2004 15:11, :
if ($ligne =~ m/"(.*)"|(S+)/)



essaye avec des paratheses :


m/("(.*)")|((S+))/
^ ^ ^ ^

comme ca, ca fonctionne ?



Dans ce cas combien de ref vs print?


Avatar
Antoun
/ab|c/ désigne un a, suivi d'un b ou d'un c. Ce que tu veux faire est
/(ab)|c/, comme indiqué par Jack.
Avatar
Jack
Le 24/10/2004 17:40, :
/ab|c/ désigne un a, suivi d'un b ou d'un c. Ce que tu veux faire est
/(ab)|c/, comme indiqué par Jack.



Bonjour,
Il ya de ça et il est souvent utile:
de ne pas négliger le else: print "echec ....",
imprimer les mémoires utilisées,
utiliser sans vergogne la variable $+,
...

Bon courage.

Avatar
Paul Gaborit
À (at) Sun, 24 Oct 2004 17:40:00 +0200,
Antoun écrivait (wrote):
/ab|c/ désigne un a, suivi d'un b ou d'un c. Ce que tu veux faire est
/(ab)|c/, comme indiqué par Jack.


Heu... m/ab|c/ cherche à reconnaître 'ab' ou 'c' mais en aucun cas 'ac' !

perl -e 'print "$&n" if "ac" =~ m/ab|c/;'
c

perl -e 'print "$&n" if "ac" =~ m/a(b|c)/;'
ac


--
Paul Gaborit - <http://www.enstimac.fr/~gaborit/>
Perl en français - <http://www.enstimac.fr/Perl/>

Avatar
Jack
Le 25/10/2004 14:54, :

À (at) Sun, 24 Oct 2004 17:40:00 +0200,
Antoun écrivait (wrote):

/ab|c/ désigne un a, suivi d'un b ou d'un c. Ce que tu veux faire est
/(ab)|c/, comme indiqué par Jack.



Heu... m/ab|c/ cherche à reconnaître 'ab' ou 'c' mais en aucun cas 'ac' !

perl -e 'print "$&n" if "ac" =~ m/ab|c/;'
c

perl -e 'print "$&n" if "ac" =~ m/a(b|c)/;'
ac


Pour être factuel, Il me semblé que l'écriture proposée par Eric ne

traitait pas cela (comme il le souhaite).
ex:
titi" et grosminet" ""


Avatar
Jack
Le 25/10/2004 16:48, :

Le 25/10/2004 14:54, :

À (at) Sun, 24 Oct 2004 17:40:00 +0200,
Antoun écrivait (wrote):

/ab|c/ désigne un a, suivi d'un b ou d'un c. Ce que tu veux faire est
/(ab)|c/, comme indiqué par Jack.




Heu... m/ab|c/ cherche à reconnaître 'ab' ou 'c' mais en aucun cas 'ac' !

perl -e 'print "$&n" if "ac" =~ m/ab|c/;'
c

perl -e 'print "$&n" if "ac" =~ m/a(b|c)/;'
ac




Pour être factuel, Il me semblé que l'écriture proposée par Eric ne
traitait pas cela (comme il le souhaite).
ex:
titi" et grosminet" ""


Autre exemple:
"titi"estparti



Avatar
Paul Gaborit
À (at) Mon, 25 Oct 2004 17:31:15 +0200,
Jack écrivait (wrote):
Pour être factuel, Il me semblé que l'écriture proposée par Eric ne traitait
pas cela (comme il le souhaite).
ex:
titi" et grosminet" ""


Autre exemple:
"titi"estparti


Ces deux exemples ne me semblent pas valides (si j'ai bien compris la demande
initiale). Donc je ferais un truc du genre :

sub test_file { # pas de prototype (ce ne sert pas vraiment)
my ($ligne) = @_;
# on veut reconnaitre toute la ligne
# (d'où les ^ et les $ de debut et de fin)
if ($ligne =~ m/^"(.+)"$|^([^" ]+)$/) {
if (defined $1) {
print "fichier avec guillemets: $1n";
return $1;
} else {
print "fichier sans guillemets: $2n";
return $2;
}
} else {
die "Nom de fichier invalide: $ligne";
}
}

Mais peut-être n'ai-je rien compris à la demande initiale ! :-(

--
Paul Gaborit - <http://www.enstimac.fr/~gaborit/>
Perl en français - <http://www.enstimac.fr/Perl/>


Avatar
Jack
Le 25/10/2004 19:01, :

À (at) Mon, 25 Oct 2004 17:31:15 +0200,
Jack écrivait (wrote):

Pour être factuel, Il me semblé que l'écriture proposée par Eric ne traitait
pas cela (comme il le souhaite).
ex:
titi" et grosminet" ""


Autre exemple:
"titi"estparti



Ces deux exemples ne me semblent pas valides (si j'ai bien compris la demande
initiale). Donc je ferais un truc du genre :

sub test_file { # pas de prototype (ce ne sert pas vraiment)
my ($ligne) = @_;
# on veut reconnaitre toute la ligne
# (d'où les ^ et les $ de debut et de fin)
if ($ligne =~ m/^"(.+)"$|^([^" ]+)$/) {
if (defined $1) {
print "fichier avec guillemets: $1n";
return $1;
} else {
print "fichier sans guillemets: $2n";
return $2;
}
} else {
die "Nom de fichier invalide: $ligne";
}
}

Mais peut-être n'ai-je rien compris à la demande initiale ! :-(


Pas de nouvelle, bonne nouvelle, donc vous avez dû faire la bonne
proposition. Mais, comme vous n'avez voulu ni titi ni grosminet :-),
je dirai que:
la variable de die ne me semble pas valorisable,
et le $+ aurait pu être considéré.



1 2