En utilisant la répétition explicitement numérotée au lieu du point d’interrogation, l’écanvas et plus

J’ai vu des motifs de regex qui utilisent une répétition explicitement numérotée au lieu de ? , * et + , c’est-à-dire:

 Explicit Shorthand (something){0,1} (something)? (something){1} (something) (something){0,} (something)* (something){1,} (something)+ 

Les questions sont:

  • Ces deux formes sont-elles identiques? Et si vous ajoutez des modificateurs possessifs / réticents?
  • S’ils sont identiques, lequel est le plus idiomatique? Plus lisible? Simplement “mieux”?

A ma connaissance, ils sont identiques. Je pense qu’il y a peut-être quelques moteurs qui ne supportent pas la syntaxe numérotée mais je ne suis pas sûr de qui. Je me souviens vaguement d’une question sur SO il ya quelques jours, où la notation explicite ne fonctionnerait pas dans Notepad ++.

La seule fois où j’utiliserais une répétition explicitement numérotée, c’est lorsque la répétition est supérieure à 1:

  • Exactement deux: {2}
  • Deux ou plus: {2,}
  • Deux à quatre: {2,4}

J’ai tendance à les préférer surtout lorsque le motif répété est plus que quelques caractères. Si vous devez faire correspondre 3 nombres, certaines personnes aiment écrire: \d\d\d mais je préfère écrire \d{3} car cela souligne le nombre de répétitions impliquées. En outre, plus tard, si ce nombre doit changer, je n’ai besoin que de changer {3} pour {n} et de ne pas ré-parsingr le regex dans ma tête ou de me soucier de le modifier; cela nécessite moins d’effort mental.

Si ce critère n’est pas rempli, je préfère la sténographie. L’utilisation de la notation «explicite» accroît rapidement la structure et rend la lecture difficile. J’ai travaillé sur un projet où certains développeurs ne connaissaient pas bien les regex (ce n’est pas exactement le sujet préféré de tout le monde) et j’ai vu beaucoup d’occurrences {1} et {0,1} . Quelques personnes me demandaient de coder leur modèle et je suggérerais alors de modifier ces occurrences pour réduire la notation et économiser de l’espace et, IMO, améliorer la lisibilité.

Je peux voir comment, si vous avez une regex qui fait beaucoup de répétitions bornées, vous voudrez peut-être utiliser le formulaire {n,m} manière cohérente pour des raisons de lisibilité. Par exemple:

 /^ abc{2,5} xyz{0,1} foo{3,12} bar{1,} $/x 

Mais je ne me souviens pas avoir jamais vu un tel cas dans la vraie vie. Quand je vois {0,1} , {0,} ou {1,} être utilisé dans une question, cela se fait presque toujours par ignorance. Et en répondant à une telle question, nous devrions également suggérer qu’ils utilisent le ? , * ou + place.

Et bien sûr, {1} est un pur fouillis. Certaines personnes semblent avoir une notion vague que cela signifie “une et une seule” – après tout, cela doit signifier quelque chose , non? Pourquoi un langage aussi pathologique soutiendrait-il un concept qui prend trois personnages et ne fait rien du tout? Son seul usage légitime que je connaisse est d’isoler un backreference suivi d’un chiffre littéral (par exemple, \1{1}0 ), mais il existe d’autres moyens de le faire.

  • Ils sont tous identiques sauf si vous utilisez un moteur de regex exceptionnel. Cependant, tous les moteurs regex ne prennent pas en charge la répétition numérotée ? ou + .

  • Si tous sont disponibles, j’utiliserais des caractères plutôt que des chiffres, simplement parce que c’est plus intuitif pour moi.

Ils sont équivalents (et vous découvrirez s’ils sont disponibles en testant votre contexte).

Le problème que je prévois est lorsque vous n’êtes peut-être pas la seule personne à avoir besoin de travailler avec votre code. Les regex sont assez difficiles pour la plupart des gens. Chaque fois que quelqu’un utilise une syntaxe inhabituelle, la question se pose: “Pourquoi ne l’ont-ils pas fait de la manière standard? A quoi pensaient-ils que je manquais?”