Appariement de chaînes


Une des possibilités les plus utiles en Perl (si ce n'est LA plus utile) est la puissance de manipulation des chaînes de caractères. Au coeur du systèmes, les Expressions Régulières (ER), qui sont utilisées par de nombreuses autres applications UNIX.


Expressions régulières

Une expression régulière est contenue par des slash "/", et l'appariement intervient avec l'utilisation d'un opérateur =~ . Les expressions suivantes sont vraies si la chaine $phrase contient la chaîne le :

$phrase =~ /le/
 

Les ER sont sensible à la casse (lettre majuscule, minuscule). Par exemple si-

$phrase = "Le petit chat gris";

alors, l'ER sera fausse. L'opérateur !~ est utilisé pour un non-appariement. Avec la chaîne ci-dessus,

$phrase !~ /le/
 

est vraie, car le n'apparait pas dans $phrase (C'est Le qui apparait).


La variable spéciale $_

On pourrait avoir la condition :

if ($phrase =~ /pas/)
{
	print "Nous parlons de rugby.\n";
}
 

qui serait vraie pour les cas suivant :

$phrase = "Une marque de pas.";
$phrase = "Il s'est surpassé.";
 

Mais souvent, il est plus facile d'affecter une chaîne à la varialbe spéciale $_ qui est bien sûr scalaire. Si nous faisons ça, nous pouvons éviter d'utiliser les opérateurs =~ et !~, et le programme ci-dessus peut être réécrit par :

if (/pas/)
{
	print "Nous parlons de rugby.\n";
}
 

La variable $_ est la varialbe pas défaut de nombreuses fonctions Perl, et tend à être utilisé très souvent.


Notions avancées sur les ER

Avec lesER, il y a énormément de caractères spéciaux, et ce sont eux qui leur dont à la fois leur puissance et leur aspect cabalistique. Il faut mieux construire sa ER lentement, et cette construction revèle de l'art.

Voci quelques caractères spéciaux, et leur signification.

.	# N'importque quel caractère, excepté les retours chariot.
^	# Un début de ligne ou de chaîne.
$	# La fin d'une ligne ou d'une chaîne.
*	# Zéro ou plus du dernier caractère.
+	# Un ou plus du dernier caractère.
?	# Zéro ou un dernier caractère.
 

et voici quelques exemples d'appariemement. N'oubliez par qu'ils doivent être inclus entre /../.

b.l	# b suivi de n'impore quoi, puis d'un l
	# This will match bol
	#                 bal
	# mais non pas bl
	#              belle
^f	# f au début de la ligne
^ftp	# au début de la ligne
e$	# e a la fin de la ligne
tle$	# tle à la fin de la ligne
und*	# un suivi d'aucun ou plusieurs d
	# Cela correspondra à
	#                 und
	#                 undd
	#                 unddd (etc)
.*	# N'importe quelle chaîne de caractère ne contenant pas un
       # un retour chariot.
^$	# Une chaîne vide.
 

Il y a encore d'autres options. Les crochet [] sont utilisés pour assortir n'importe lequel des caractères qu'il contiennent. A l'intérieur des crochets, "-" signifie : entre et "^" signifie : pas.

 

[qjk]		# Soit q ou j ou k
[^qjk]		# Soit pas q ou pas j ou pas k
[a-z]		# Toutes les lettres de  a à z inclus
[^a-z]		# Pas de lettre minuscule
[a-zA-Z]	# N'importe quelle lettre minuscule ou majuscule
[a-z]+		# N'importe quelle enchaînement de lettres
 

A ce niveau, vous pouvez sautez la suite, et allez directement à l'excercice. La suite est principalement une référence.

Une barre verticale represente "ou", et les parenthèses sont utilisées pour grouper :

confiture|creme	# Soit de la confiture soit de la creme
(rare|bele)ment	# Soit rarement soit belement
(da)+		# Un ou plusieurs da (da, dada, dadada, dadadada....)

Encore d'autres caractères spéciaux :

\n		# Retour chariot
\t		# Un tab
\w		# Un caractère alpha-numérique.
		# idem que [a-zA-Z0-9_]
\W		# Caractère non-alpha-numérique.
		# idem que [^a-zA-Z0-9_]
\d		# Un chiffre. idem que [0-9]
\D		# Un non-chiffre. Idem que[^0-9]
\s		# Un caractètre d'espacement : espace,
		# tab, retour chariot, etc
\S		# Un caractère qui n'est pas un espacement
\b		# Une limite de mot, hormis []
\B		# Pas de limite de mot.
 

Bien évidemment, les caractères comme $, |, [, ), \, / et ainsi de suite sont spéciaux pour les ER. Pour effectuer des recherches sur eux, il faut les faire précéder d'un backslash. Ainsi :

\|		# Barre verticale
\[		# Un crochet ouvrant
\)		# Un crochet fermant
\*		# Un asterisque
\^		# Un accent circonflexe
\/		# Un slash
\\		# Un backslash
 

Et ainsi de suite....


Exemples de RE

Comme nous l'avons dit plus haut, il est sûement meiux de construire votre expérience des RE lentement. Voici quelques exemples. N'oubliez pas de les placer entre /.../. Un test rendrait un résultat vrai si la chaîne contient :

[01]		# Soit "0" ou "1"
\/0		# Une division par zéro: "/0"
\/ 0		# Une division par zéro avec un espace: "/ 0"
\/\s0		# Une division par zéro sans espace:
		# "/ 0" et l'espace peut être un espace, un tab....
\/ *0		# Une division par zéro avec éventuellement des espaces
		# "/0" ou "/ 0" ou "/  0" etc.
\/\s*0		# Une division par zéro avec eventuellement un espace
		# ou un tab ....
\/\s*0\.0*	# Idem que précédemmment, mais avec une virgule
		# et éventuellement des 0 après. Par exemple :
		# "/0." et "/0.0" et "/0.00" etc et
		# "/ 0." et "/  0.0" et "/   0.00" etc.
 


Exercice

Précedement, votre programme comptait les lignes non vide. Modifiez le pour qu'il compte les lignes qui contiennent :

A chaque fois, le programme devrait afficher toutes les lignes, mais ne compter que celles spécifiées. Essayez d'utiliser la variable $_ pour éviter l'opérateur =~.


Precedent Start Suivant