Connaissez vos goûts regex
Un nombre surprenant de personnes pensent que les expressions régulières sont essentiellement agnostiques. Cependant, il existe des différences assez importantes entre les saveurs, et en particulier pour le golf de code, il est bon de connaître quelques-unes d'entre elles, ainsi que leurs caractéristiques intéressantes, afin que vous puissiez choisir le meilleur pour chaque tâche. Voici un aperçu de plusieurs saveurs importantes et de ce qui les distingue des autres. (Cette liste ne peut pas être vraiment complète, mais laissez-moi savoir si j'ai raté quelque chose de vraiment flagrant.)
Perl et PCRE
Je les jette dans un seul récipient, car je ne connais pas très bien la saveur Perl, qui est la plupart du temps équivalente (PCRE est après tout des expressions régulières compatibles Perl). L'avantage principal de la version Perl est que vous pouvez appeler du code Perl depuis l'intérieur de la regex et de la substitution.
- Récursion / sous-routines . Probablement la caractéristique la plus importante pour le golf (qui n'existe que dans quelques saveurs).
- Modèles conditionnels
(?(group)yes|no)
.
- Soutient le changement de cas dans la chaîne de remplacement avec
\l
, \u
, \L
et \U
.
- PCRE permet l’alternance en regard, chaque alternative pouvant avoir une longueur différente (mais fixe). (La plupart des saveurs, y compris Perl, exigent que les contours aient une longueur totale).
\G
d'ancrer un match à la fin du match précédent.
\K
réinitialiser le début du match
- PCRE prend en charge les propriétés de caractères Unicode et les scripts .
\Q...\E
pour échapper à de plus longues séries de caractères. Utile lorsque vous essayez de faire correspondre une chaîne contenant de nombreux méta-caractères.
.NET
C'est probablement la saveur la plus puissante, avec seulement très peu d'inconvénients.
Une lacune importante en termes de golf est qu’elle ne prend pas en charge les quantificateurs possessifs comme certains autres parfums. Au lieu de cela, .?+
vous devrez écrire (?>.?)
.
Java
- Suite à un bogue (voir Annexe), Java prend en charge un type limité de recherche de longueur variable: vous pouvez regarder au-
.*
delà du début de la chaîne, d'où vous pouvez maintenant commencer une recherche, comme (?<=(?=lookahead).*)
.
- Prend en charge l'union et l'intersection des classes de caractères.
- Possède le support le plus complet pour Unicode, avec des classes de caractères pour les "scripts Unicode, blocs, catégories et propriétés binaires" .
\Q...\E
comme dans Perl / PCRE.
Rubis
Dans les versions récentes, cette version est aussi puissante que PCRE, y compris la prise en charge des appels de sous-routines. Comme Java, il prend également en charge l'union et l'intersection de classes de caractères. Une caractéristique spéciale est la classe de caractères intégrée pour les chiffres hexadécimaux: \h
(et le négatif \H
).
La fonctionnalité la plus utile pour jouer au golf est cependant la façon dont Ruby gère les quantificateurs. Plus particulièrement, il est possible d'imbriquer des quantificateurs sans parenthèses. .{5,7}+
fonctionne et fait ainsi .{3}?
. En outre, contrairement à la plupart des autres versions, si la limite inférieure d’un quantificateur est définie, 0
elle peut être omise, par exemple .{,5}
équivalente à .{0,5}
.
En ce qui concerne les sous - routines, la différence majeure entre les sous - routines de PCRE et les sous - routines de Ruby, est que la syntaxe de Ruby est un octet plus (?n)
vs \g<n>
, mais les sous - routines de Ruby peut être utilisé pour la capture, alors que PCRE remet à zéro la capture après une finition de sous - programme.
Enfin, Ruby a une sémantique différente pour les modificateurs liés aux lignes de la plupart des autres versions. Le modificateur généralement appelé m
dans d'autres versions est toujours activé dans Ruby. Donc ^
, faites $
toujours correspondre le début et la fin d'une ligne, pas seulement le début et la fin de la chaîne. Cela peut vous faire économiser un octet si vous avez besoin de ce comportement, mais cela vous coûtera des octets supplémentaires si vous ne le faites pas, car vous devrez remplacer ^
et $
par \A
et \z
respectivement. En plus de cela, le modificateur généralement appelé s
(qui fait .
correspondre les sauts de ligne) est appelé m
en Ruby. Cela n'affecte pas le nombre d'octets, mais il faut le garder à l'esprit pour éviter toute confusion.
Python
Python a une saveur solide, mais je ne connais pas de fonctionnalités particulièrement utiles que vous ne trouverez nulle part ailleurs.
Cependant , il existe une variante qui vise à remplacer le re
module à un moment donné et qui contient de nombreuses fonctionnalités intéressantes. Outre la prise en charge de la récursivité, des recherches de longueur variable et des opérateurs de combinaison de classes de caractères, il offre également la caractéristique unique de la correspondance floue . En substance, vous pouvez spécifier un certain nombre d'erreurs (insertions, suppressions, substitutions) autorisées. Le moteur vous donnera également des correspondances approximatives.
ECMAScript
La saveur ECMAScript est très limitée, et donc rarement très utile pour le golf. La seule chose qui lui va, c'est la classe de caractères vides annulée [^]
pour correspondre à n'importe quel caractère, ainsi que la classe de caractères vides qui échoue inconditionnellement []
(par opposition à l'habituel (?!)
). Malheureusement, la saveur n'a aucune caractéristique qui rend ce dernier utile pour les problèmes normaux.
Lua
Lua a sa propre saveur assez unique, qui est assez limitée (par exemple, vous ne pouvez même pas quantifier les groupes) mais qui vient avec une poignée de fonctionnalités utiles et intéressantes.
- Il comporte un grand nombre de raccourcis pour les classes de caractères intégrées , notamment la ponctuation, les majuscules et les minuscules et les chiffres hexadécimaux.
- Avec
%b
cela prend en charge une syntaxe très compacte pour faire correspondre les chaînes équilibrées. Par exemple, %b()
correspond à a (
, puis à tout, jusqu'à une correspondance )
(en sautant correctement les paires appariées internes). (
et )
peut être deux personnages ici.
Renforcer
La saveur regex de Boost est essentiellement celle de Perl. Cependant, il a quelques nouvelles fonctionnalités intéressantes pour la substitution de regex, y compris les modifications de casse et les conditions . Ce dernier est propre à Boost, à ma connaissance.