Regex : rechercher l'absence d'une sous-chaîne au sein d'une chaîne de caractères

07 mai 2017

Dans une expression régulière, comment faire pour chercher une chaîne ne contenant pas une sous-chaîne particulière ?

On peut utiliser le negative lookahead, ou le negative lookbehind. Voir : http://www.regular-expressions.info/lookaround.html

Le negative lookahead permet de contrôler si une chaîne de caractère n'en suit pas une autre. On regarde devant.

Le negative lookbehind permet de contrôler si une chaîne de caractères n'en précède pas une autre. On regarde derrière.

Exemple d'utilisation de negative lookahead :

La syntaxe de base est la suivante : jeveux(?!jeneveuxpas)

Rechercher toutes les chaînes commençant par <? sans être suivies de php, que j'ai utilisé pour débusquer ce raccourci dans de vieux projets. Pour rappel, le raccourci <? ne fonctionne que si l'option short_open_tag est activée dans php.ini. Je souhaite les remplacer par le tag complet <?php.

<?(?!php) Retourne tous les tags <? non suivis de php.

<?(?!php|xml|=) Retourne tous les tags <? non suivis de php, xml ou =, toutes les versions de php décemment récentes (> 5.4) supportant par défaut <?= comme raccourci pour <?php echo, je suis ok pour les conserver tels quels.

Exemple d'utilisation de negative lookbehind

La syntaxe de base est la suivante : (?<!jeneveuxpas)jeveux

Je veux toutes les chaînes function non précédées de private, protected ou static, avec au moins une espace précédant function.

(?<!public|protected|static)s+function

Sites utiles