C’est une page de référence – ne vous sentez pas obligé de la lire car elle est plutôt laconique. D’autres sections y renvoient en cas de besoin.
Les modificateurs Regex apparaissent à chaque coin de rue sur ce site. Plutôt que d’expliquer à plusieurs reprises ce qu’ils font et les multiples façons de les activer dans chaque saveur de regex, j’ai décidé de rassembler les quatre plus courants (i, s, m et x) en un seul endroit. La dernière section examine brièvement les modificateurs, qui sont généralement spécifiques à la langue.
Points de saut
Pour faciliter la navigation, voici quelques points de saut vers diverses sections de la page :
✽ Insensibilité à la casse : i
✽ DOTALL (le point correspond aux sauts de ligne) : s (sauf Ruby et JavaScript)
✽ Multiline (^ et $ correspondent à chaque ligne) : m (sauf Ruby)
✽ Espacement libre : x (sauf JavaScript)
✽ Autres modificateurs
✽ Modificateurs spéciaux de début de motif du PCRE
(lien direct)
Insensibilité à la casse : i
Par défaut, tous les principaux moteurs regex correspondent en mode sensible à la casse. Si vous souhaitez que des motifs tels que Nom : + correspondent en mode insensible à la casse, nous devons activer cette fonctionnalité.
Oui, mais…
Que signifie vraiment l’insensibilité à la casse ?
Tant que vous vous en tenez aux 26 lettres de l’alphabet anglais, la définition des majuscules et des minuscules est simple. Lorsque vous vous étendez aux subtilités typographiques ou à d’autres langues et écritures, les choses ne sont pas toujours aussi simples. Voici quelques questions que vous pouvez rencontrer.
✽ Est-ce que fl (un caractère, c’est-à-dire la ligature fl) correspond à FL?
✽ Est-ce que à (un caractère) correspond à À?
✽ Est-ce que à (deux caractères, c’est-à-dire la lettre a et l’accent grave) correspond à À ? Tous les moteurs semblent gérer cela correctement.
✽ ß correspondra-t-il à ss ? Aucun moteur ne semble le faire.
✽ i correspondra-t-il à İ (i majuscule turc) ainsi qu’à I ?
Ces questions ne sont que la pointe de l’iceberg. Même si je connaissais toutes les réponses, il serait impossible de les inclure toutes dans cette section : si vous utilisez un script particulier, vous devrez rechercher comment votre moteur spécifique gère la correspondance insensible à la casse dans ce script.
Plus d’une façon
Pour plusieurs moteurs, notez qu’il existe deux façons d’activer la correspondance insensible à la casse : comme modificateur en ligne ( ?i) ou comme option dans la méthode ou la fonction regex.
Modificateur en ligne (?i)
Dans .NET, PCRE (C, PHP, R…), Perl, Python, Java et Ruby (mais pas JavaScript), vous pouvez utiliser le modificateur en ligne (?i), par exemple dans (?i)cat. Consultez la section sur les modificateurs en ligne pour obtenir des détails juteux sur trois fonctionnalités supplémentaires (non disponibles en Python) : l’activer en milieu de chaîne, le désactiver avec (?-i), ou l’appliquer uniquement au contenu d’un groupe non capturé avec (?i:foo)
.NET
A part le modificateur en ligne (?i), les langages .NET disposent de l’option IgnoreCase. Par exemple, en C#, vous pouvez utiliser :var catRegex = new Regex("cat", RegexOptions.IgnoreCase);
Perl
A part le modificateur en ligne (?i), Perl vous permet d’ajouter le drapeau i après le délimiteur de fermeture de votre motif. Par exemple, vous pouvez utiliser :if ($the_subject =~ m/cat/i) { … }
PCRE (C, PHP, R…)
Notez que dans PCRE, pour utiliser la correspondance insensible à la casse avec des lettres non anglaises qui ne font pas partie de votre locale, vous devrez activer le mode Unicode – par exemple avec le modificateur spécial de début de motif (*UTF8).
En dehors du modificateur ( ?i) modificateur en ligne, PCRE vous permet de définir le mode PCRE_CASELESS lors de l’appel de la fonction pcre_compile() (ou similaire):
cat_regex = pcre_compile( "cat", PCRE_CASELESS, &error, &erroroffset, NULL );
En PHP, l’option PCRE_CASELESS est passée via le drapeau i, que vous pouvez ajouter dans votre chaîne regex après le délimiteur de fermeture. Par exemple, vous pouvez utiliser :$cat_regex = '~cat~i';
En R, l’option PCRE_CASELESS est transmise via l’option ignore.case=TRUE. Par exemple, vous pouvez utiliser:grep("cat", subject, perl=TRUE, value=TRUE, ignore.case=TRUE);
Python
A part le modificateur en ligne (?i), Python possède l’option IGNORECASE. Par exemple, vous pouvez utiliser:cat_regex = re.compile("cat", re.IGNORECASE)
Java
A part le modificateur en ligne (?i), Java a l’option CASE_INSENSITIVE. Par exemple, vous pouvez utiliser:
Pattern catRegex = Pattern.compile( "cat", Pattern.CASE_INSENSITIVE | Pattern.UNICODE_CASE );
L’option UNICODE_CASE ajoutée ici garantit que la fonction d’insensibilité à la casse est compatible avec l’Unicode. Si vous travaillez uniquement avec l’ASCII, vous n’avez pas besoin de l’utiliser.
JavaScript
En JavaScript, votre seule option est d’ajouter le drapeau i après le délimiteur de fermeture de votre motif. Par exemple, vous pouvez utiliser :var catRegex = /cat/i;
Ruby
A part le modificateur en ligne (?i), Ruby vous permet d’ajouter le drapeau i après le délimiteur de fermeture de votre motif. Par exemple, vous pouvez utiliser :
cat_regex = /cat/i
(lien direct)
DOTALL (Dot Matches Line Breaks) : s (with exceptions)
Par défaut, le point . ne correspond pas aux caractères de saut de ligne tels que les sauts de ligne et les retours chariot. Si vous voulez que des motifs tels que BEGIN .* ? END correspondent à travers les lignes, nous devons activer cette fonctionnalité.
Ce mode est parfois appelé single-line (d’où le s) car en ce qui concerne le point, il transforme toute la chaîne en une seule grande ligne-.* correspondra du premier caractère au dernier, peu importe le nombre de sauts de ligne qui se trouvent entre les deux.
Ce mode est également appelé DOTALL dans PCRE, Python et Java (pour être plus précis, la documentation de PCRE utilise PCRE_DOTALL). Pour moi, le nom DOTALL est une manière judicieuse d’appeler ce mode. La troisième option dot-matches-line-breaks est descriptive mais un peu longue à prononcer.
Pour plusieurs moteurs, notez qu’il existe deux façons de l’activer : comme modificateur en ligne ou comme option dans la méthode ou la fonction regex.
JavaScript
JavaScript ne prend pas en charge le mode ligne unique. Pour faire correspondre n’importe quel caractère en JavaScript, y compris les sauts de ligne, utilisez une construction telle que . Cette classe de caractères correspond à un caractère qui est soit un non-digit \D, soit un digit \d. Par conséquent, elle correspond à n’importe quel caractère.
Une autre solution JavaScript consiste à utiliser la bibliothèque regex XRegExp. Si vous disposez d’un temps infini, vous pouvez également essayer de porter PCRE en JavaScript en utilisant Emscripten, comme Firas semble l’avoir fait sur regex 101.
Modificateur en ligne (?s)
Dans .NET, PCRE (C, PHP, R…), Perl, Python et Java (mais pas Ruby), vous pouvez utiliser le modificateur en ligne (?s), par exemple dans (?s)BEGIN .* ? END. Consultez la section sur les modificateurs en ligne pour obtenir des détails juteux sur trois fonctionnalités supplémentaires (non disponibles en Python) : l’activer en milieu de chaîne, le désactiver avec (?-s) ou l’appliquer uniquement au contenu d’un groupe non capturable avec (?s:foo)
.NET
A part le modificateur en ligne (?s), les langages .NET disposent de l’option Singleline. Par exemple, en C#, vous pouvez utiliser :
var blockRegex = new Regex( "BEGIN .*? END", RegexOptions.IgnoreCase | RegexOptions.Singleline );
Perl
En dehors du modificateur en ligne (?s), Perl vous permet d’ajouter le drapeau s après le délimiteur de fermeture de votre motif. Par exemple, vous pouvez utiliser :
if ($the_subject =~ m/BEGIN .*? END/s) { … }
PCRE (C, PHP, R…)
En dehors du modificateur en ligne (?s), PCRE vous permet de définir le mode PCRE_DOTALL lors de l’appel de la fonction pcre_compile() (ou similaire):
block_regex = pcre_compile( "BEGIN .*? END", PCRE_DOTALL, &error, &erroroffset, NULL );
En PHP, l’option PCRE_DOTALL est transmise via le drapeau s, que vous pouvez ajouter dans votre chaîne regex après le délimiteur de fermeture. Par exemple, vous pouvez utiliser :$block_regex = '~BEGIN .*? END~s';
Python
A part le modificateur en ligne (?s), Python dispose de l’option DOTALL. Par exemple, vous pouvez utiliser:block_regex = re.compile("BEGIN .*? END", re.IGNORECASE | re.DOTALL)
Java
En dehors du modificateur en ligne (?s), Java dispose de l’option DOTALL. Par exemple, vous pouvez utiliser:
Pattern blockRegex = Pattern.compile( "BEGIN .*? END", Pattern.CASE_INSENSITIVE | Pattern.DOTALL );
Ruby : Modificateur (?m) et drapeau m
En Ruby, vous pouvez utiliser le modificateur en ligne (?m), par exemple dans (?m)BEGIN .* ? END. Il s’agit d’une bizarrerie de Ruby, car d’autres moteurs utilisent (?m) pour le mode » ^ et $ correspondent à chaque ligne « .
Voir la section sur les modificateurs en ligne pour des détails juteux sur trois fonctionnalités supplémentaires : l’activer au milieu de la chaîne, le désactiver avec (?-m), ou l’appliquer uniquement au contenu d’un groupe de non-capture avec (?m:foo)
Ruby vous permet également d’ajouter le drapeau m à la fin de votre chaîne regex. Par exemple, vous pouvez utiliser :block_regex = /BEGIN .*? END/m
(lien direct)
Origines de DOTALL
Le mode monoligne est aussi souvent appelé DOTALL (qui signifie « dot matches all ») à cause de l’option PCRE_DOTALL dans PCRE, de l’option re.DOTALL dans Python et de l’option Pattern.DOTALL dans Java.
J’ai entendu dire plusieurs fois que « DOTALL est un truc de Python » mais cela semblait venir de personnes qui n’avaient pas entendu parler des options équivalentes dans PCRE et Java. Cela m’a quand même amené à me demander : où DOTALL est-il apparu en premier ? En regardant le journal des modifications de PCRE et l’ancienne documentation Python, il semble qu’il soit apparu dans PCRE avec la version 0.96 (octobre 1997), dans Python avec la version 1.5 (février 1998), puis dans Java 1.4 (février 2002). L’écart entre les introductions de PCRE et de Python n’étant pas concluant – le mot a pu circuler dans des versions bêta antérieures, voire dans d’autres outils -, j’ai interrogé Philip Hazel (le père de PCRE) à ce sujet. Il m’a répondu :
Je crois l’avoir inventé – je ne l’avais certainement pas vu ailleurs lorsque j’essayais de penser à un nom pour l’option PCRE qui correspond à l’option /s de Perl. (« S » y signifie « single-line » (…) donc je voulais un meilleur nom.)
Alors là. Ceux qui aiment un peu d’histoire pourraient apprécier cette pépite savoureuse.
(lien direct)
Multiline (^ and $ Match on Every Line) : m (except Ruby)
Par défaut, dans tous les principaux moteurs sauf Ruby, les ancres ^ et $ ne correspondent (respectivement) qu’au début et à la fin de la chaîne.
En Ruby, elles correspondent au début et à la fin de chaque ligne, et il n’y a aucun moyen de désactiver cette fonctionnalité. C’est en fait une façon raisonnable de faire les choses, avec laquelle Ruby se rachète partiellement d’utiliser m pour le mode DOTALL alors que d’autres moteurs utilisent s.
Dans d’autres moteurs, si vous voulez que des motifs tels que ^Define et >>>$ correspondent (respectivement) au début et à la fin de chaque ligne, nous devons activer cette fonctionnalité.
Cette fonctionnalité est généralement appelée multi-ligne (d’où le m) parce que les ancres ^ et $ opèrent sur plusieurs lignes.
Pour plusieurs moteurs, notez qu’il y a deux façons de l’activer : comme modificateur en ligne (?m) ou comme option dans la méthode ou la fonction regex.
Ruby
En Ruby, les ancres ^ et $ correspondent toujours sur toutes les lignes. Il n’y a aucun moyen de désactiver cette option. C’est en fait une façon assez agréable de faire les choses, puisque, comme dans la plupart des saveurs, il existe des ancres distinctes pour le début et la fin des chaînes de caractères : \A, \Z et \z.
En revanche, on peut regretter le choix de Ruby d’utiliser le drapeau et le modificateur m de manière non standard (voir DOTALL).
Modificateur en ligne (?m)
Dans .NET, PCRE (C, PHP, R…), Perl, Python, Java et Ruby (mais pas JavaScript), vous pouvez utiliser le modificateur en ligne (?m), par exemple dans (?m)^cat. Consultez la section sur les modificateurs en ligne pour obtenir des détails juteux sur trois fonctionnalités supplémentaires (non disponibles en Python) : l’activer en milieu de chaîne, le désactiver avec (?-m) ou l’appliquer uniquement au contenu d’un groupe non capturable avec (?m:foo)
.NET
A part le modificateur en ligne (?m), les langages .NET disposent de l’option Multiline. Par exemple, en C#, vous pouvez utiliser :
var catRegex = new Regex("^cat", RegexOptions.IgnoreCase | RegexOptions.Multiline);
Perl
A part le modificateur en ligne (?m), Perl vous permet d’ajouter le drapeau m après le délimiteur de fermeture de votre motif. Par exemple, vous pouvez utiliser :
if ($the_subject =~ m/^cat/m) { … }
PCRE (C, PHP, R…)
En dehors du modificateur en ligne (?m), PCRE vous permet de définir le mode PCRE_MULTILINE lors de l’appel de la fonction pcre_compile() (ou similaire):
cat_regex = pcre_compile( "^cat", PCRE_CASELESS | PCRE_MULTILINE, &error, &erroroffset, NULL );
En PHP, l’option PCRE_MULTILINE est transmise via le drapeau m, que vous pouvez ajouter dans votre chaîne regex après le délimiteur de fermeture. Par exemple, vous pouvez utiliser :$cat_regex = '~^cat~m';
Python
A part le modificateur en ligne (?m), Python possède l’option MULTILINE. Par exemple, vous pouvez utiliser:cat_regex = re.compile("^cat", re.IGNORECASE | re.MULTILINE)
Java
A part le modificateur en ligne (?m), Java a l’option MULTILINE. Par exemple, vous pouvez utiliser:
Pattern catRegex = Pattern.compile( "^cat", Pattern.CASE_INSENSITIVE | Pattern.MULTILINE );
JavaScript
En JavaScript, votre seule option est d’ajouter le drapeau m après le délimiteur de fermeture de votre motif. Par exemple, vous pouvez utiliser :var catRegex = /^cat/m;
(lien direct)
Espaces libres : x (sauf JavaScript)
Par défaut, tout espace dans une chaîne regex spécifie un caractère à faire correspondre. Dans les langues où vous pouvez écrire des chaînes regex sur plusieurs lignes, les sauts de ligne spécifient également les caractères littéraux à faire correspondre. Parce que vous ne pouvez pas insérer d’espaces pour séparer les groupes qui portent des significations différentes (comme vous le faites entre les phrases et les pragraphes lorsque vous écrivez en anglais), une regex peut devenir difficile à lire, comme par exemple la regex Sens de la vie de la page d’humour regex:^(?=(?!(.))()(?-1)(?<!\d(?<=(?!)\d))).$
Heureusement, de nombreux moteurs supportent un mode d’espacement libre qui vous permet d’aérer votre regex. Par exemple, vous pouvez ajouter des espaces entre les tokens. En PHP, vous pourriez écrire ceci – notez le drapeau x après le délimiteur final ~:$word_with_digit_and_cap_regex = '~ ^ (?=\D*\d) \w*\w* $ ~x';
Mais pourquoi rester sur une seule ligne ? Vous pouvez répartir votre regex sur autant de lignes que vous le souhaitez – en l’espaçant et en ajoutant des commentaires – qui sont introduits par un #. Par exemple, en C#, vous pouvez faire quelque chose comme ceci:
var wordWithDigitAndCapRegex = new Regex(@"(?x) # Free-spacing mode ^ # Assert that position = beginning of string ######### Lookahead ########## (?= # Start lookahead \D* # Match any non-digits \d # Match one digit ) # End lookahead ######## Matching Section ######## \w* # Match any word chars # Match one upper-case letter \w* # Match any word chars $ # Assert that position = end of string");
Ce mode est appelé mode d’espacement libre. Vous pouvez également le voir appelé mode espace blanc, mode commentaire ou mode verbeux.
Cela peut être exagéré dans une simple regex comme celle ci-dessus (bien que toute personne qui doit maintenir votre code vous en remerciera). Mais si vous construisez un motif de regex sérieux comme celui de l’astuce pour faire correspondre des nombres en anglais simple… À moins que vous ne soyez masochiste, vous n’avez pas le choix.
Notez qu’à l’intérieur d’une classe de caractères, le caractère espace et le # (qui introduit autrement des commentaires) sont toujours honorés – sauf en Java, où ils doivent tous deux être échappés si vous voulez faire correspondre ces caractères.
Pour plusieurs moteurs, il y a deux façons d’activer le mode d’espacement libre : comme modificateur en ligne ou comme option dans la méthode ou la fonction regex.
Le mode d’espacement libre est merveilleux, mais il y a quelques dangers mineurs dont vous devez être conscient, car ils peuvent vous laisser vous gratter la tête en vous demandant pourquoi un motif ne fonctionne pas comme vous l’attendez.
Danger de parcours #1 : la signification de l’espace
Premièrement, vous ne pouvez plus utiliser Number : \d+ pour correspondre à une chaîne de caractères telle que Numéro : 24. La raison en est que l’espace dans : \d ne correspond plus à un espace. Nous sommes en mode espacement libre, vous vous souvenez ? C’est tout l’intérêt.
Pour faire correspondre un caractère d’espace, vous devez le spécifier. Les deux principales façons de le faire sont de le placer à l’intérieur d’une classe de caractères, ou de l’échapper avec un backslash. L’une ou l’autre de ces méthodes peut fonctionner : Numéro:\d+ ou Numéro:\ \d+
Bien sûr, Numéro:\s\d+ correspondrait également, mais n’oubliez pas que \s correspond à bien plus qu’un caractère d’espace. Par exemple, il peut correspondre à une tabulation ou à un saut de ligne. Ce n’est peut-être pas ce que vous voulez.
Trip Hazard #2 : Late Start
Deuxièmement, vous pouvez être trop confiant dans le pouvoir de l’espacement libre et essayer quelque chose comme ceci afin de laisser la regex se tenir toute seule:
var wordWithDigitAndCapRegex = new Regex(@" (?x) # Free-spacing mode ^ # Beginning of string etc # Match the literal chars e,t,c");
Le problème avec ceci est que bien qu’il puisse sembler que le modificateur d’espacement libre ( ?x) est la première chose dans votre regex, ce n’est pas le cas.
Après le guillemet ouvrant « , nous avons un saut de ligne et un certain nombre d’espaces. Le moteur essaie de les faire correspondre, car à ce stade, nous ne sommes pas encore en mode espacement libre. Ce mode n’est activé que lorsque nous rencontrons (?x). Cette regex ne correspondra jamais à la chaîne etc et plus, car au moment où nous rencontrons le début de l’ancre de chaîne ^, nous sommes censés avoir déjà fait correspondre un saut de ligne et des caractères d’espacement !
C’est pourquoi si vous regardez le premier exemple, vous verrez que le modificateur d’espacement libre (?x) est la toute première chose après le caractère guillemet ouvrant.
Les espaces blancs ne sont pas simplement rognés dans le motif
Même si les espaces blancs sont ignorés, la position d’un espace blanc sépare toujours le token précédent du suivant. Par exemple,
✽ (A)\1 2 n’est pas la même chose que (A)\12. Le premier correspond à AA2, le second correspond à A\n dans .NET, PCRE, Perl et Ruby (12 est le code octal pour le caractère de saut de ligne)
✽ \p{Nd} est valide, mais \p{N d} ne l’est pas – sauf dans Perl et Ruby
JavaScript
JavaScript ne supporte pas le mode d’espacement libre. En JavaScript, pour faire correspondre n’importe quel caractère, y compris les sauts de ligne, utilisez une construction telle que . Cette classe de caractères correspond à un caractère qui est soit un non-chiffre \D, soit un chiffre \d. Par conséquent, elle correspond à n’importe quel caractère.
Une autre solution JavaScript consiste à utiliser la bibliothèque regex XRegExp. Si vous disposez d’un temps infini, vous pouvez également essayer de porter PCRE vers JavaScript en utilisant Emscripten, comme Firas semble l’avoir fait sur regex 101.
Modificateur en ligne (?s)
Dans .NET, PCRE (C, PHP, R…), Perl, Python, Java et Ruby (mais pas JavaScript), vous pouvez utiliser le modificateur en ligne ( ?x), par exemple, il s’agit d’une regex aérée pour correspondre à des mots répétés:(?x) (\w+) + \b
Voir aussi la section sur les modificateurs en ligne.
.NET
A part le modificateur en ligne (?x), les langages .NET disposent de l’option IgnorePatternWhitespace. Par exemple, en C#, vous pouvez utiliser :
var repeatedWordRegex = new Regex(@" (\w+) + \b", RegexOptions.IgnorePatternWhitespace );
Perl
A part le modificateur en ligne (?x), Perl vous permet d’ajouter le drapeau x après le délimiteur de fermeture de votre motif. Par exemple, vous pouvez utiliser :if ($the_subject =~ m/(\w+) + \b/x) { … }
PCRE (C, PHP, R…)
En dehors du modificateur (?x) inline, PCRE vous permet de définir le mode PCRE_EXTENDED lors de l’appel de la fonction pcre_compile() (ou similaire):
repeated_word_regex = pcre_compile( "(\w+) + \b", PCRE_EXTENDED, &error, &erroroffset, NULL );
En PHP, l’option PCRE_EXTENDED est transmise via le drapeau x, que vous pouvez ajouter dans votre chaîne regex après le délimiteur de fermeture. Par exemple, vous pouvez utiliser :$repeated_word_regex = '~(\w+) + \b~x';
Python
A part le modificateur en ligne (?x), Python dispose de l’option VERBOSE. Par exemple, vous pouvez utiliser:
repeated_word_regex = re.compile(r"(\w+) + \b", re.VERBOSE)
Java
Contrairement à d’autres moteurs, à l’intérieur d’une classe de caractères Java les hachages introduisent des commentaires et des espaces sont ignorés, vous devez donc les échapper si vous voulez utiliser ces caractères dans une classe, par exemple +
En dehors du modificateur en ligne (?x), Java dispose de l’option COMMENTS. Par exemple, vous pouvez utiliser :
Pattern repeatedWordRegex = Pattern.compile( "(\w+) + \1\b", Pattern.COMMENTS );
Ruby
En dehors du modificateur en ligne (?x), Ruby vous permet d’ajouter le drapeau x à la fin de votre chaîne regex. Par exemple, vous pouvez utiliser :repeated_word_regex = /(\w+) + \b/x
(lien direct)
Autres modificateurs
Certains moteurs supportent des modificateurs et des drapeaux en plus de i, s, m et x. Je prévois de les couvrir dans les pages dédiées à ces saveurs.
Par exemple,
✽ .NET possède le modificateur (?n) (également accessible via l’option ExplicitCapture). Cela transforme tous les (parenthèses) en groupes non capturables. Pour capturer, vous devez utiliser des groupes nommés.
✽ Java possède le modificateur (?d) (également accessible via l’option UNIX_LINES). Lorsque celui-ci est activé, le caractère de saut de ligne \n est le seul à affecter le point . (qui ne correspond pas aux sauts de ligne sauf si DOTALL est activé) et les ancres ^ et $ (qui correspondent aux débuts et fins de ligne en mode multiligne.)
✽ Perl possède plusieurs autres drapeaux. Voir la section modificateur de la documentation.
✽ PCRE possède le modificateur (?J) (également disponible dans le code via l’option PCRE_DUPNAMES). Lorsqu’il est défini, différents groupes de capture sont autorisés à utiliser le même nom – bien que des numéros différents leur soient attribués.
(lien direct)
✽ PCRE possède le modificateur (?U) (également disponible dans le code via l’option PCRE_UNGREEDY). Lorsqu’il est défini, les quantificateurs sont non avides par défaut. L’ajout d’un ? les rend gourmands.
(lien direct)
✽ PCRE possède le modificateur (?X) (également disponible dans le code via l’option PCRE_EXTRA). Historiquement, ce mode a été utilisé pour activer de nouvelles fonctionnalités en cours de développement. Actuellement, il déclenche des erreurs si des tokens tels que \B sont utilisés dans une classe de caractères (où normalement il correspond à la lettre majuscule B, contrairement à ce qui se passe en dehors d’une classe de caractères, où il s’agit d’une assertion de limite de non-mot).
✽ PCRE dispose d’un certain nombre de modificateurs spéciaux qui peuvent être définis au début du motif (ceux-ci sont présentés ci-dessous). De plus, de nombreuses options peuvent être envoyées à la famille de fonctions pcre_compile(), si vous y avez accès. Pour plus de détails sur celles-ci, obtenez pcre_compile.html du dossier doc en téléchargeant PCRE.
(lien direct)
Les modificateurs spéciaux de début de motif de PCRE
PCRE possède un certain nombre de « modificateurs spéciaux » que vous pouvez définir au début d’un motif. Au lieu de la syntaxe standard (?z) pour les modificateurs en ligne, la syntaxe des modificateurs spéciaux ressemble à (*MYMODIFIER). Ces modificateurs sont particulièrement utiles dans les contextes où PCRE est intégré dans un outil ou un langage – car ils remplacent un certain nombre d’options que vous enverriez à pcre_compile().
Chaînes UTF
En supposant que PCRE est compilé avec les options pertinentes, vous pouvez demander au moteur de traiter la chaîne sujet comme différents types de chaînes UTF.
✽ (*UTF) est une manière générique de traiter le sujet comme une chaîne UTF – en détectant si elle doit être traitée comme UTF-8, UTF-16 ou UTF-32.
✽ (*UTF8), (*UTF16) et (*UTF32) traitent la chaîne de caractères comme l’un des trois encodages UTF spécifiques.
Propriétés Unicode pour \d et \w
Par défaut, \d ne correspond qu’aux chiffres ASCII, tandis que \w ne correspond qu’aux chiffres, lettres et caractères de soulignement ASCII.
Le modificateur (*UCP) (qui signifie Unicode Character Properties) permet à ces jetons de correspondre aux chiffres et aux caractères de mot Unicode.
Par exemple, (*UCP)\d+ : : \w+ correspond à 1۳۲١८৮੪ : : Aれま래도ᚠᚱᚩ
(Voir démo).
En combinaison avec (*UCP), vous devrez peut-être aussi utiliser l’un des modificateurs (*UTF). Pour voir comment cela fonctionne, considérez la sortie de ce programme avec un PHP Xampp standard:
$string = '1۳۲١८৮੪ :: Aれま래도ᚠᚱᚩ';$utfregex = "~\d+ :: \w+~";$utfregex = "~(*UCP)\d+ :: \w+~";$utfregex = "~(*UTF)(*UCP)\d+ :: \w+~";$utfregex = "~(*UTF)\d+ :: \w+~";$utfregex = "~\d+ :: \w+~u";foreach (range(0, 4) as $i) { echo "$i: ".preg_match($utfregex,$string)."<br />"; }// Output:// 0: 0// 1: 0// 2: 1 => (*UTF)(*UCP)// 3: 0// 4: 1 => The u flag produces the same result as (*UTF)(*UCP)
Modificateurs de saut de ligne
Par défaut, lorsque le PCRE est compilé, vous lui indiquez ce qu’il doit considérer comme un saut de ligne lorsqu’il rencontre un . (comme le point il ne correspond pas aux sauts de ligne sauf en mode dotall), ainsi que le comportement des ancres ^ et $ en mode multiligne. Vous pouvez remplacer cette valeur par défaut avec les modificateurs suivants :
✽ (*CR) Seul un retour chariot est considéré comme un saut de ligne
✽ (*LF) Seul un saut de ligne est considéré comme un saut de ligne (comme sous Unix)
✽ (*CRLF) Seul un retour chariot suivi d’un saut de ligne est considéré comme un saut de ligne (comme sur Windows)
✽ (*ANYCRLF) N’importe lequel des trois ci-dessus est considéré comme un saut de ligne
✽ (*ANY) Toute séquence de nouvelle ligne Unicode est considérée comme un saut de ligne
Par exemple, (*CR)\w+.\w+ correspond à Line1\nLine2 car le point est capable de correspondre au \n, qui n’est pas considéré comme un saut de ligne. Voir démo.
Contrôle du \R
Par défaut, le métacaractère \R correspond à toute séquence de nouvelle ligne Unicode. Lorsque le mode UTF-8 est désactivé, ces séquences de nouvelle ligne sont la paire \r\n, ainsi que les caractères retour chariot, saut de ligne, tabulation verticale, saut de formulaire ou ligne suivante. En mode UTF-8, le jeton correspond également au séparateur de ligne et au caractère de séparation de paragraphe.
Deux modificateurs de début de motif vous permettent de modifier le comportement de \R:
✽ Avec (*BSR_ANYCRLF), \R correspond uniquement à la séquence \r\n, \r ou \n. Ceci peut également être défini lorsque PCRE est compilé ou demandé via l’option PCRE_BSR_ANYCRLF
✽ Avec (*BSR_UNICODE), \R correspond à n’importe quelle séquence de nouvelles lignes Unicode (remplaçant l’option PCRE_BSR_ANYCRLF si elle est définie). Cela peut également être défini lorsque PCRE est compilé ou demandé via l’option PCRE_BSR_UNICODE
Contrôle des motifs en fuite
Pour limiter le nombre de fois où PCRE appelle la fonction match(), utilisez le modificateur (*LIMIT_MATCH=x), en fixant x au nombre souhaité.
Pour limiter la récursion, utilisez (*LIMIT_RECURSION=d), en fixant d au niveau de récursion le plus profond autorisé.
Désactiver les optimisations
(lien direct)
Par défaut, PCRE étudie le motif et rend automatiquement atomique un token quantifié lorsque le token suivant est incompatible – par exemple en transformant A+X en A++X. Le modificateur (*NO_AUTO_POSSESS) désactive cette optimisation. Utilisez-le lorsque vous voulez utiliser pcretest pour évaluer deux motifs et vous féliciter de tous les cycles que l’auto-possessification vous fait économiser.
Par défaut, PCRE effectue plusieurs optimisations pour savoir plus rapidement si une correspondance va échouer. Le modificateur (*NO_START_OPT) désactive ces optimisations.
Désactiver les correspondances vides
Dans PCRE2, (*NOTEMPTY) indique au moteur de ne pas retourner les correspondances vides. De même, (*NOTEMPTY_ATSTART) indique au moteur de ne pas retourner les correspondances vides trouvées au début du sujet.
Désactivation de l’optimisation de l’ancrage automatique
Dans PCRE2, PCRE2_NO_DOTSTAR_ANCHOR indique au moteur de ne pas ancrer automatiquement les motifs qui commencent par .*
Vous pouvez en savoir plus sur ce drapeau sur la page de l’API de PCRE2 (recherchez PCRE2_NO_DOTSTAR_ANCHOR).
et la meilleure astuce de Regex de tous les temps !!!
Les 1001 façons d’utiliser Regex
.