J'ai récemment rencontré un puzzle pour trouver une expression régulière qui correspond:
Cordes de 5 caractères à 5 caractères constituées de lettres anglaises minuscules en ordre croissant ASCII Command P> blockQuote>
Des exemples valides incluent: p>
xxx pré> exemples non valides incluent: p>
xxx pré> Ma solution actuelle est kludgie . J'utilise la regex: p>
xxx pré> qui utilise un groupe de capture non consommant pour affirmer une longueur de chaîne de 5, puis vérifie que la chaîne comprend des lettres anglaises minuscules dans l'ordre ( voir Rubular ). P>
à la place, j'aimerais utiliser des références arrière à l'intérieur du caractère Des classes. Quelque chose comme: p>
xxx pré>
4 Réponses :
Je pose cette réponse plus comme un commentaire qu'une réponse puisqu'il a une meilleure mise en forme que des commentaires.
liée à vos questions: P>
- Puis-je utiliser des références arrière dans mes classes de caractères pour vérifier les chaînes d'ordre croissant? LI> ol> BlockQuote>
Non, vous ne pouvez pas. Si vous regardez un look un Section Régulière de Backdref , vous trouverez ci-dessous la documentation: P>
parenthèses et arrière-plan ne peuvent pas être utilisés dans des classes de caractères forts> p> Les parenthèses ne peuvent pas être utilisées dans des classes de caractères, du moins pas comme des métacaractères. Lorsque vous mettez une parenthèse dans une classe de caractères, elle est traitée comme un caractère littéral. Donc, la regex [(a) b] correspond à A, B, (et). P>
Backreferences, aussi, ne peut pas être utilisé à l'intérieur d'une classe de caractères forte>. Le \ 1 dans une regex comme (a) [\ 1b] est une erreur
ou un littéral 1 fort inutilement échappé. En JavaScript, c'est une évasion octale. P> blockQuote> En ce qui concerne votre 2e question: p>
- Y a-t-il une solution moins de hacky à ce casse-tête? LI> ol> blockQuote>
IMHO, votre regex est parfaitement bien, vous pouvez la raccourcir très peu au début comme celui-ci: p>
xxx pré>
Regex Demo strong> p> P>
Je pense que ça vaut la peine de dire pourquoi i> Les rafraîchissements dans des classes de caractères ne sont pas possibles. Une anti-perfection peut indiquer une sous-chaîne assortie, qui pourrait être n'importe quelle longueur, même vide. Ainsi, le code comme [\ 1-z] code> pourrait produire
[- z] code>,
[fz] code>,
[foo-z] code> etc. qui n'a pas beaucoup de sens et que le motif devrait être recompilé à la volée, empêchant ainsi les optimisations.
Il est dérangeant de voir les documents cités lorsqu'ils ne fournissent pas de raisons pour des raisons si quelque chose ne peut pas être utilisé de manière aussi fondamentale. Les références à l'intérieur des classes de caractères sont un exemple. Mais vous pouvez toujours utiliser votre propre raisonnement pour un tel cas, et il est assez facile de savoir pourquoi dans ce cas.
Si vous êtes prêt à utiliser Perl (!), cela fonctionnera:
/^([a-z])((??{"[$1-z]"}))((??{"[$2-z]"}))((??{"[$3-z]"}))(??{"[$4-z]"})$/
Mais ... ça triche! :) Si vous utilisez Perl, je suppose que vous pourriez simplement coder l'affirmation directement: / ^ ([[[AZ] {5}) $ (? (? {$ 1 EQ (JOINT ", Sort SPLIT QR ##, $ 1 )}) | (?!)) / code>
À un moment donné, je pense qu'il est douteux de savoir si vous faites une solution de regex. Je pense que le mien est plus proche du continuum :)
Puisque quelqu'un a cassé la glace en utilisant perl, c'est un
Solution Perl, je suppose ..
Notez qu'il s'agit d'une solution de base non dégophale qui arrive à être
bourré dans des constructions de code à l'intérieur d'une plus grande réégalité de Perl. la regex code PERL p>
La chose intéressante est que si une journée vient quand vous avez besoin de la synergie
de regex / code c'est un bon choix.
Il est alors possible qu'au lieu d'un simple [A-Z] code>, vous pouvez
Utilisez un motif très complexe de sa place et d'utiliser un chèque par rapport au dernier.
C'est la puissance !! / em> p>
^ (?: ([[Az]) (? (? {$ Dernier GT $ 1}) (?!) | ( ? {$ last = 1}))) {5} $ code> p>
good aaaaa
good abcde
good xxyyz
good ghost
good chips
good demos
bad abCde
bad xxyyzz
bad hgost
bad chps
Ah, eh bien, c'est un ensemble fini, vous pouvez donc toujours l'énumérer avec une alternance! Cela émet une sorte de «force brute» de regex dans un petit Perl repl: et maintenant: p> la regex est seulement 220 Ko ou tellement; -) p> p>
Aargh. Votre regex a cassé rubrique (ne peut pas faire un permalink). :-) Oui, c'est 219 KB RAW et fonctionne!
Merci pour cela. Utilisation du texte brut de regex (de @Jedi Coller bin), je l'ai mis via ce Outil ternaire A > et a fait une trie complète de regex soufflé. Qui a réduit la taille un peu (160k compressé , 840k formaté ). Voici un Test Python .
En outre, j'ai généré les chaînes complètes de 142 506 possibles, puis utilisée la TRIE REGEX complète que j'ai faite pour tester les performances: REGEX1:
Pour autant que je sache, votre solution de kludgie est aussi douce que possible parce que les classes de personnages ne jouent pas bien avec votre courte retour (mais je ressemble à votre logique, semble être une bonne fonctionnalité). Avez-vous un environnement spécifique pour exécuter cette regex dans (rubis seulement ou agnostique)? Je suis convaincu que les sorciers de regex de SO vont-ils subir prochainement pour ajouter leur expertise.
Euh, pas de retour de retour dans les classes de caractères. La raison en est que les classes de caractères sont composées à Compilation Time i>. Le facteur déterminant est qu'une brouillon est dynamique et ce qui la disqualifie à l'intérieur d'une classe est l'opérateur de gamme. Donc, ils disent .. aucune plage dynamique i> ELST Le moteur se bloque dans une exception C ++.
est tombé sur un puzzle pour trouver une expression régulière code> - Assurez-vous de CITE I> Ce lien afin que nous puissions rire de la puzzler ..
En fait, c'est assez facile dans une regex Perl. Vous pouvez faire toutes sortes de choses, comme le comptage, les séquences, les bools, la soustraction, etc.
(? {..}) code>. Si vous pensez utiliser Perl, alors c'est .. faisable. BTW, votre première regex est tout à fait bien.
Une autre chose à noter est que dans les classes de caractères, l'opérateur gamme i> concerne des caractères unique (min, max) et non un ensemble de caractères, comme
\ pl-z code> jette une construction Erreur. Dans cette veine, une référence peut contenir plusieurs caractères.
Pourquoi
démos code> inclus dans la liste non valide?
Ok, votre regex a l'air assez gentil avec moi. Vous pouvez l'améliorer légèrement en utilisant:
^ (? = [AZ] {5} $) A * B * C * D * E * F * G * H * I * J * K * L * M * N * o * p * q * r * s * t * u * v * w * x * y * z * $ code>
Dupliquer de https://stackoverflow.com/questions/3171671/regex-5-Digits- I-croissant-commande
La question ne peut pas être fermée en raison de la prime, mais c'est une liaison de dupe morte-sur-lepe.