Une histoire de métacaractères



Pour commencer, et avant d'aller plus loin, il me semble important de porter à votre connaissance une nouvelle notion : les métacaractères.
Ce n'est pas une insulte de programmeur, mais un mot qui signifie tout simplement « caractères spéciaux ». Ce sont des caractères pas comme les autres qui ont un rôle ou un sens particulier.


Alerte mon Général ! Les métacaractères s'échappent !

Dans le langage PCRE (des regex), les métacaractères qu'il faut connaître sont les suivants :

# ! ^ $ ( ) [ ] { } ? + * . \ |


Il faut bien les retenir. Pour la plupart d'entre eux, vous les connaissez déjà.
Ainsi, le dollar « $ » est un caractère spécial parce qu'il permet d'indiquer une fin de chaîne.
De même pour l'accent circonflexe, le dièse, les parenthèses, les crochets, les accolades et les symboles « ? + * » : nous les avons tous utilisés dans le chapitre précédent, souvenez-vous.
Pour le point « . » et l'antislash « \ », vous ne les connaissez pas mais vous n'allez pas tarder à les apprendre.


Bon, ce sont des caractères spéciaux et chacun d'eux signifie quelque chose de précis. Et alors ?


Et alors, le problème vous tombe dessus le jour où vous voulez chercher par exemple « Quoi ? » dans une chaîne.
Comment écririez-vous la regex ? Comme ça ?

#Quoi ?#


Eh non, surtout pas ! Le point d'interrogation, vous le savez, sert à dire que la lettre juste avant est facultative (elle peut apparaître 0 ou 1 fois). Ici, l'espace devant le point d'interrogation serait donc facultatif, mais ce n'est pas ce qu'on veut faire !

Alors, comment faire pour faire comprendre qu'on recherche « Quoi ? » alors que le point d'interrogation a déjà une signification ?
Il va falloir l'échapper. Cela signifie que vous devez placer en fait un antislash « \ » devant un caractère spécial. Ainsi, la bonne regex serait :

#Quoi \?#

Ici, l'antislash sert à dire que le point d'interrogation juste après n'est pas un symbole spécial, mais bel et bien une lettre comme une autre !


C'est la même chose pour tous les autres métacaractères que je vous ai montrés plus haut (# ! ^ $ ( ) [ ] { } ? + * . \) : il faut mettre un antislash devant si vous voulez les utiliser dans votre recherche.
Vous remarquerez que pour utiliser un antislash il faut… un antislash devant ! Comme ceci : \\.


Bien tordu tout ça, non ?


Pourtant, ce que vous devez retenir est simple : si vous voulez utiliser un caractère spécial dans votre recherche, il faut placer un antislash devant. Point barre.
Je vous donne quelques exemples d'utilisation, ça devrait bien vous faire rentrer ça dans la tête :


Chaîne

regex

Résultat

Je suis impatient !

#impatient \!#

VRAI

Je suis (très) fatigué

#\(très\) fatigué#

VRAI

J'ai sommeil…

#sommeil\.\.\.#

VRAI

Le smiley :-\

#:-\\#

VRAI


Le cas des classes


Il reste une dernière petite chose à voir (encore un cas particulier), et cela concerne les classes de caractères.
Jusqu'ici, vous avez mis des lettres et des chiffres entre les crochets ; par exemple :
#[a-z0-9]#
Oui mais, vous vous en doutez, vous avez le droit de mettre d'autres caractères, comme les accents (mais dans ce cas, il faut les énumérer un à un). Par exemple : [a-zéèàêâùïüë] et ainsi de suite.

Jusqu'ici, tout va bien. Mais si vous voulez lister aussi des caractères spéciaux, hum ? Par exemple un point d'interrogation (au hasard). Eh bien là, ça ne compte pas ! Pas besoin de l'échapper : à l'intérieur de crochets les métacaractères… ne comptent plus !
Ainsi, cette regex marche très bien :
#[a-z?+*{}]#
Elle signifie qu'on a le droit de mettre une lettre, un point d'interrogation, un signe +, etc.


3 cas particuliers, cependant.


  • « # » (dièse) : il sert toujours à indiquer la fin de la regex. Pour l'utiliser, vous DEVEZ mettre un antislash devant, même dans une classe de caractères.
  • « ] » (crochet fermant) : normalement, le crochet fermant indique la fin de la classe. Si vous voulez vous en servir comme d'un caractère que vous recherchez, il faut là aussi mettre un antislash devant.
  • « - » (tiret) : encore un cas un peu particulier. Le tiret – vous le savez – sert à définir un intervalle de classe (comme [a-z]). Et si vous voulez ajouter le tiret dans la liste des caractères possibles ? Eh bien il suffit de le mettre soit au début de la classe, soit à la fin. Par exemple : [a-z0-9-] permet de chercher une lettre, un chiffre ou un tiret.

Créé avec HelpNDoc Personal Edition: Découvrez la puissance d'un site Web réactif pour votre documentation