OVH Cloud OVH Cloud

regexp (encore!)

3 réponses
Avatar
julien
Bonjour
J'aimerai faire une recherche sur un enseble de caractères tout en
interdisants certains. Par exemple, je voudrais chercher les ensebles
comprenant des lettres (\w), des tirest(-) mais pas de _ ni de nombre
(\d). Il me faut donc "mixer" [-\w] et [^_\d]. J'ai essayé [-\w^_\d]
mais cela ne marche pas.

Merci
Julien

3 réponses

Avatar
axel tournevis
[-a-zA-Z] pour QUE des lettres ( w FAUX = [a-zA-Z0-9_] ), des tirest(-)
[D_] pour tout sauf des chiffres et _

ta question n'est pas claire

AT.

"julien" a écrit dans le message de news:
3fd3f49c$0$19301$
Bonjour
J'aimerai faire une recherche sur un enseble de caractères tout en
interdisants certains. Par exemple, je voudrais chercher les ensebles
comprenant des lettres (w), des tirest(-) mais pas de _ ni de nombre
(d). Il me faut donc "mixer" [-w] et [^_d]. J'ai essayé [-w^_d]
mais cela ne marche pas.

Merci
Julien



Avatar
Michel Rodriguez
axel tournevis wrote:


J'aimerai faire une recherche sur un enseble de caractères tout en
interdisants certains. Par exemple, je voudrais chercher les ensebles
comprenant des lettres (w), des tirest(-) mais pas de _ ni de nombre
(d). Il me faut donc "mixer" [-w] et [^_d]. J'ai essayé [-w^_d]
mais cela ne marche pas.


[-a-zA-Z] pour QUE des lettres ( w FAUX = [a-zA-Z0-9_] ), des tirest(-)
[D_] pour tout sauf des chiffres et _


Sauf que [a-z] ne prends pas en compte les caracteres accentues, ce qui
peut poser un probleme en francais.

En fait ca depend aussi de la version de Perl utilisee et du jeu de
caractere (latin1 ou utf8).

Voila un script pour tester differentes option, la derniere regexp
marche chez moi, avec perl 5.8.1 et des donnees en UTF8. Au moins tu
peux t'en servir pour tester diverses regexps:

#!/usr/bin/perl -w
use strict;
use charnames ':full';

my @regexps= ( '[-a-zA-Z]', '([^Wd_]|-)', '[p{L}-]', 'p{IsOk}' );

my $format= "%-30s" . (" %-10s" x scalar @regexps) . "n";
printf $format, "texte", @regexps;

while( my $texte= <DATA>)
{ chomp $texte;
my @results= map { $texte=~ /^$_+$/ ? " X" : " _" } @regexps;
printf $format, $texte, @results;
}

# regarde man perlunicode pour comprendre ce que ca fait
sub IsOk
{ return <<'END';
+utf8::L
+utf8::InLatin1Supplement
002D
END
}

__DATA__
toto
toto9
9
toto-tata
toto_tata
étété
été-té
été_té

<-- fin du script!

Le resultat?
texte [-a-zA-Z] ([^Wd_]|-) [p{L}-] p{IsOk}
toto X X X X
toto9 _ _ _ _
9 _ _ _ _
toto-tata X X X X
toto_tata _ _ _ _
étété _ _ _ X
été-té _ _ _ X
été_té _ _ _ _


Avatar
julien
Michel Rodriguez wrote:
#!/usr/bin/perl -w
use strict;
use charnames ':full';

my @regexps= ( '[-a-zA-Z]', '([^Wd_]|-)', '[p{L}-]', 'p{IsOk}' );
Merci beaucoup, j'ai lu avec attention perlunicode.

J'ai un probleème avec le p{IsOK}. Dans l'exemple ci-dessus, il fallait
remplacer les ' par " pour IsOK soit "interprété".
Par contre, ça pose problème pour des choses du sytle
$line=~/p{IsOK}/g; car IsOK n'ets pas inteprété (non remplacé par la
valeur de retour de sub IsOk{}) et j'ai donc une message d'erreur "Can't
find Unicode property definition "IsOk"." J'ai essayé différentes
méthodes pour faire interprété le IsOK, mais cela ne fonctionne pas (si
je fais my $regexp="p{IsOk}"; j'ai droit à Unrecognized escape p
passed through).

Merci
Julien