Votre mission est d'écrire l'expression régulière la plus courte valide à laquelle aucune chaîne ne peut correspondre, chaîne vide incluse.
Les soumissions doivent avoir cette forme ("notation littérale"):
/pattern/optional-flags
La plus courte expression rationnelle gagne. La taille de l'expression rationnelle est comptée en caractères. (y compris les barres obliques et les drapeaux)
S'il vous plaît expliquer comment votre expression rationnelle fonctionne (si ce n'est pas trivial)
Merci et amusez-vous!
Réponses:
6 caractères
Après les réponses de primo et Peter Taylor, et un indice tiré de
man perlre
:/(?!)/
Cette expression rationnelle compatible Perl correspond à une chaîne vide qui n'est pas suivie d'une autre chaîne vide.
la source
/x\by/
, mais si jamais je devais réellement utiliser une regex comme celle-ci - pour une raison quelconque - cette réponse serait aussi la plus claire)/(*FAIL)/
est probablement plus clair, cependant. (Et enman perlre
fait, il a donné cela en mentionnant que le mien s'étend réellement à son interne.)/(*FAIL)/
n'est pas aussi portable cependant. Et même en Perl, je pense que c'est une caractéristique plus obscure qu'un aspect négatif.-Mre=debug
) indique que cela(?!)
est optimisé(*FAIL)
par Perl regex optimizer (OPFAIL
selon-Mre=debug
). De plus, je ne pense pas avoir vu à l'(*FAIL)
extérieur de Perl 5 (et Perl 6, où il s'appelle<!>
).8 caractères
Nous avons besoin d'une chaîne contenant un caractère qui est à la fois
a
etb
, ce qui est évidemment impossible.la source
/(?!x)x/
semble encore plus impossible ;-)5 caractères
Contrairement à tous ceux qui abusent
$
et^
... cela fonctionne en Perl:\A
correspond au début de la chaîne.la source
^
aussi.6 caractères
Basé sur la réponse de Sven Hohenstein .
la source
8 personnages
Une limite de mot (
\b
) entourée de caractères 'mot' (\w
un des[_a-zA-Z0-9]
). Il est impossible à joindre car l'un des caractères précédant ou suivant une limite de mot doit être un caractère non 'mot'.À propos: cela ressemble à l'expression inégalable
où
\W
signifie non-mot 'caractère'.la source
/
comptent. Voir l'entrée de OP, par exemple . C'est une excellente entrée, cependant!4 caractères
recherche un "a" après la fin de la chaîne.
ou
recherche avant le début de la chaîne.
la source
^
et$
dans des positions "illégales" les fait simplement traiter comme des personnages ordinaires. Votre premier exemple correspond au littéral$a
desed
et probablement à d’autres programmes.echo 'a^b' | grep 'a^b'
contreecho 'a^b' | grep -E 'a^b'
. Découvrez 9.4.9 ERE Ancrage Expression5 personnages
/$.^/
/$^/
correspondra à une chaîne vide, alors qu'exiger un caractère entre les deux ne le sera pas.la source
"$a^"
(ou quoi que ce soit à la place de'a'
) en Perl ( et peut-être sed ). Encore une belle, cependant!$.
comme la variable de numéro de ligne actuelle. Ce qui pourrait être vide, auquel cas ce sera le cas/^/
.^
et$
'$^'
avec grep, mais malheureusement, il correspondait à la chaîne'$^'
. Smartass grep.9 caractères
Je ne suis pas sûr, mais je
/[^\S\s]/
devrais être inégalable, car cela ne signifie aucun personnage, mais au moins un d'entre eux.la source
+
.6 personnages
Je pense que cette regex que j'ai faite va marcher:
Il correspond à une limite de mot (
\b
) qui n'est pas une limite de mot (\B
). Quel est l'impost - dois-je vraiment vous l'expliquer?la source
4 personnages
(Version ECMAScript uniquement)
Dans d'autres variantes, il ne s'agit pas d'une classe de caractères valide (
]
considérée comme un caractère de la classe, l'expression n'est donc pas valide car la classe n'est jamais fermée), mais le standard ECMAScript accepte les classes de caractères vides. Puisqu'il s'agit d'une classe, il doit correspondre à un caractère (donc les chaînes vides ne correspondent pas), mais comme aucun caractère n'est inclus, aucun caractère réel ne correspond non plus.la source
/[]{0}/
. (Ps. Bien que ma propre réponse ressemble en partie à la vôtre, j'ai en fait lu la vôtre après avoir écrit la mienne.)/[]/.test("")
. ça retourne faux. une classe de caractères ne peut jamais correspondre à une chaîne vide, même si elle ne contient pas de caractères (j'imagine qu'elles sont implémentées comme "SI le prochain caractère de la chaîne est l'un de ceux répertoriés, match; ELSE fail")./[]{0}/
est légal (dans ECMAScript) et correspond à la chaîne vide ... Cependant, je ne suis pas sûr de savoir en quoi cela est pertinent pour ma réponse.6 caractères
Le quantificateur possessif cherche autant de b's que possible, puis 1 de plus. 6 caractères mais des points pour la symétrie?
la source
6 personnages
Pas un gagnant, mais j'ai pensé que c'était amusant. grep et Python sont tous les deux sur ce coup-là, mais Perl semble être d'accord avec ça.
Cela semble être très dépendant de la mise en œuvre (ce qui n’est guère surprenant compte tenu de son étrangeté). Bob indique ci-dessous qu'il correspond à quoi que ce soit dans le moteur de regex de JavaScript.
la source
Peut-être un peu de triche, mais…
… Est imbattable dans les regex POSIX dans pratiquement toutes les implémentations, si ce n'est toutes. BASIC RE et EXTENDED RE, même.
Et POSIX RE n’a pas besoin de ces barres obliques ni de ces drapeaux.
la source
0
ne fonctionne pas dans PERL."0"=~0
est vrai ...\0
ITYM? Oui, la plupart des implémentations perlre (1) et PCRE n'utilisent pas de chaînes C, mais des tampons limités en taille, dans lesquels cette astuce ne fonctionnera pas, mais la plupart des implémentations POSIX RE fonctionnent sur des chaînes C.5 caractères
Correspond à la chaîne qui commence par n'importe quel caractère avant le début de la chaîne.
la source
".^"
re.findall(r'^.^', '.^', re.DEBUG)
^
et.
sont des métacaractères non littérales, qui doivent être4 caractères:
Fonctionne avec GNU grep 2.5.1 et egrep.
la source
/.^/
= 4 caractères.//
? ceux-ci ne sont pas nécessaires partout ;-)/
comptent, voir la question initiale ("y compris les barres obliques et les drapeaux") et l' entrée du PO .Perl 6 (5 caractères)
Un peu abusé des règles (parce que les expressions rationnelles Perl 6 sont différentes et incompatibles avec les expressions rationnelles stardard de par leur conception), mais je m'en fiche.
<!>
La règle informe Perl 6 que la regex ne correspond pas.la source
6 octets
Abréviation de
(*FAIL)
, prise en charge par les moteurs de regex compatibles perl. Merci à @HamZa pour l'avoir signalé.9 octets
Devrait fonctionner avec n’importe quel moteur de regex prenant en charge les verbes. Je ne suis pas convaincu qu'il faille jouer davantage au golf.
la source
(*FAIL)
est un verbe qui échoue toujours./(*F)/
:)4 caractères
Nécessite n'importe quel caractère après la fin de la chaîne
la source
$
n’est spécial qu’à la fin du motif.4 caractères avec barres obliques 2 sans
Dans le moteur de regex du langage TXR, une classe de caractères vide
[]
ne correspond à aucun caractère, et donc aucune chaîne. Il se comporte de cette manière car la classe de caractères nécessite une correspondance de caractère et, lorsqu'elle est vide, elle spécifie qu'aucun caractère ne peut la satisfaire.Une autre façon est d'inverser le « ensemble de toutes les chaînes , y compris vide » regex en
/.*/
utilisant l'opérateur complément:/~.*/
. Le complément de cet ensemble ne contient aucune chaîne et ne peut donc rien correspondre.Tout cela est documenté dans la page de manuel:
Les barres obliques ne font pas partie de la syntaxe regex en soi; ce ne sont que des ponctuations qui délimitent les expressions rationnelles dans la notation S-expression. Témoin:
la source
6 caractères
(ou 4, selon votre point de vue)
la source
C'est un regex à 5 caractères.
Il correspond à un groupe vide une ou plusieurs fois.
MODIFIER:
Suppression de ma réponse pour d'autres saveurs:
Tout ce qui n’est pas un nombre à l’intérieur de {} correspondra au texte.
Celui-ci correspondra à ". {- 1}"
la source
5 personnages
J'espère que cela ne semble pas stupide:
/[]+/
la source
Une chose qui se termine avant même d'avoir commencé ...
la source
""
, il ne correspond une chaîne contenant ces deux caractères littéraux:"$^"
.