Golf de regex2 chasses jouables incluses

Stratégies pour le golf de regex : comment battre le par

Sept techniques pour écrire la regex la plus courte qui attrape chaque cible et épargne le reste, avec des plateaux interactifs à résoudre directement dans l'article.

Logo de Regex Hunter

· 6 min de lecture

/^c.*t/

à attraper

  • cart
  • chart
  • coat

à épargner

  • scat
  • crab

Le golf de regex est un jeu simple : vous recevez deux listes de mots. Écrivez l'expression régulière la plus courte qui correspond à tout ce qui est dans la première liste (les monstres) et à rien de la seconde (les innocents). Chaque caractère compte, et chaque plateau a un par : la longueur à battre.

L'astuce, c'est que le golf de regex ne parle pas vraiment de syntaxe. Il s'agit de voir. Voici sept réflexes qui séparent une réponse de 28 caractères d'une réponse de 5. Tous les exemples sont interactifs : tapez dans les plateaux, ou cliquez sur Essayer pour ouvrir le motif dans le bac à sable.

01Décrivez la différence, pas les mots

Le réflexe du débutant, c'est de décrire les monstres. Celui du golfeur, c'est de trouver le plus petit point commun que seuls les monstres partagent.

Comparaison82 % plus court

Plateaucat · cart · chart · coat · cast vs act · arc · tack · scat · crab

  1. tout listerrésout28
    /^(cat|cart|chart|coat|cast)$/
  2. factoriserrésout20
    /^c(a|ar|har|oa|as)t$/
  3. la différencerésout5
    /^c.*t/
Essayer le plus court
Même plateau, trois réponses. La gagnante ne décrit pas du tout les mots : elle se contente de les séparer.

Les cinq monstres commencent par c et ont un t quelque part après. Aucun innocent ne remplit ces deux conditions. Cette observation vaut 23 caractères.

L'échelle du rabotage : lister les mots coûte 28 caractères, factoriser en coûte 20, décrire la différence en coûte 5

02Les ancres sont le filtre le moins cher qui soit

^ et $ coûtent un caractère chacune et peuvent éliminer des groupes entiers d'innocents. Regardez ce qui se passe quand on retire le ^ de la réponse ci-dessus :

Correspondances4/6 comme prévu
/c.*t/

Doit correspondre3/3

  • cat
  • chart
  • coast

Ne doit pas1/3

  • act
  • scat
  • crab
Essayez-le dans le bac à sable
Sans l'ancre ^, « act » et « scat » se faufilent : tous deux contiennent un c suivi plus loin d'un t.

Deux caractères d'ancre coûtent presque toujours moins cher que de rendre le reste du motif plus malin. Quand un plateau se départage par la position (le début ou la fin des mots), pensez d'abord aux ancres.

03Cherchez, ne faites pas correspondre le mot entier

Le golf de regex utilise une sémantique de recherche : votre motif doit seulement correspondre quelque part dans un mot, pas au mot entier. Inutile donc de tout entourer de ^…$ ou de rembourrer avec .* :

Au lieu de Écrivez Gain
^.*ing$ ing$ 3
.*foo.* foo 4
^(a|b) ^[ab] 1

Les .* en début et en fin ne sont que du rembourrage. (Le panneau de diagnostic de Regex Hunter les signale exactement pour cette raison.)

04Dépensez vos caractères là où ils comptent

Beaucoup de fonctionnalités des regex ont une écriture courte et une longue. Les golfeurs prennent toujours la courte :

Long Court Gain
[0-9] \d 3
[A-Za-z0-9_] \w 10
(a|b|c) [abc] 2
.{2} .. 2
aa* a+ 1
(?:ab)+ (ab)+ 2

Les groupes non capturants sont une bonne hygiène dans du code de production, et des caractères gaspillés au golf.

05Laissez les références arrière voir les motifs à votre place

Quand les monstres partagent une forme plutôt que des lettres précises (une lettre doublée, un bloc répété), une référence arrière fait le travail. (.) capture n'importe quel caractère ; \1 exige à nouveau le même.

Motif5 car.
/(.)\1/
Essayez-le dans le bac à sable
« N'importe quel caractère, puis ce même caractère à nouveau » : une lettre doublée n'importe où dans le mot.

Essayez sur un plateau. Le par est la longueur de ce motif :

Chasse jouablepar 5

Attrapez les mots qui ont une lettre doublée.

Cibles · 0/5 attrapées

  • bookcible
  • lettercible
  • coffeecible
  • ballooncible
  • grasscible

Innocents · erreurs : 0

  • bakeinnocent
  • paperinnocent
  • stoneinnocent
  • orangeinnocent
  • tigerinnocent

Tapez une regex — le plateau se met à jour en direct.

Essayez-le dans le bac à sable
Ça vous plaît ? Une nouvelle chasse chaque jour.Jouer la chasse du jour

06L'espace négatif : dites ce qui ne peut pas y être

Parfois, les monstres se définissent par ce qui leur manque. Il y a deux façons de dire « aucun e nulle part », et l'une est plus courte :

Comparaison13 % plus court

Plateaumoon · ask · dog · trunk · swift vs tree · eagle · green · apple · code

  1. lookaheadrésout8
    /^(?!.*e)/
  2. classe négativerésout7
    /^[^e]*$/
Essayer le plus court
Les deux marchent. La classe de caractères négative est plus courte d'un caractère que le lookahead : essayez-la avant de dégainer (?!…).

Les lookaheads se rendent utiles quand il vous faut plusieurs conditions à la fois (« contient un chiffre et aucun espace »). Pour une seule lettre absente, la classe négative l'emporte.

07Quand rien n'est partagé, couvrez l'ensemble

Certains plateaux n'ont pas de règle unique et élégante. Le jeu devient alors un puzzle de couverture : trouvez quelques minuscules fragments (j, bu, a.a) qui attrapent chacun quelques monstres et aucun innocent, et reliez-les avec |. C'est exactement comme ça que fonctionne le célèbre solveur de Peter Norvig ; nous en parlons dans Le golf de regex de xkcd : l'énigme derrière la BD 1313.

08À vous de jouer

Un dernier plateau. Les monstres partagent une structure, et les innocents sont choisis pour punir les réponses évidentes : (.)\1 attrape les mauvais mots, et (.).\1 attrape presque tout. Saurez-vous atteindre le par ?

Chasse jouablepar 6

Attrapez les mots qui contiennent un bloc de deux lettres répété.

Cibles · 0/5 attrapées

  • bananacible
  • papayacible
  • cocoacible
  • dodocible
  • hahacible

Innocents · erreurs : 0

  • abbainnocent
  • llamainnocent
  • saladinnocent
  • tattooinnocent
  • cheeseinnocent

Tapez une regex — le plateau se met à jour en direct.

Essayez-le dans le bac à sable
Ça vous plaît ? Une nouvelle chasse chaque jour.Jouer la chasse du jour

09Continuez à jouer

  • Chaque jour, une nouvelle chasse avec un par à battre : jouez celle du jour.
  • Les packs d'entraînement regroupent les plateaux par technique (ancres, classes, quantificateurs, références arrière) : commencez par les bases.
  • Bloqué sur la syntaxe ? Le Guide des regex couvre chaque élément, et le bac à sable vous permet de tout tester.