Ihre Mission ist es, den kürzesten gültigen regulären Ausdruck zu schreiben, mit dem keine Zeichenfolge übereinstimmen kann, einschließlich der leeren Zeichenfolge.
Einsendungen müssen dieses Formular haben ("wörtliche Notation"):
/pattern/optional-flags
Kürzester regulärer Ausdruck gewinnt. Die reguläre Ausdrucksgröße wird in Zeichen gezählt. (einschließlich Schrägstriche und Flaggen)
Bitte erläutern Sie, wie Ihr regulärer Ausdruck funktioniert (wenn es nicht trivial ist)
Danke und viel Spaß!
Antworten:
6 Zeichen
Folgen Sie den Antworten von Primo und Peter Taylor und einem Hinweis von
man perlre
:/(?!)/
Dieser Perl-kompatible reguläre Ausdruck entspricht einer leeren Zeichenfolge, auf die keine weitere leere Zeichenfolge folgt.
quelle
/x\by/
, aber wenn ich jemals einen regulären Ausdruck wie diesen verwenden musste - aus welchem Grund auch immer - dann ist diese Antwort auch die klarste)/(*FAIL)/
ist wahrscheinlich klarer. (Undman perlre
gab es tatsächlich durch Erwähnung, dass meine tatsächlich zu seiner internen erweitert.)/(*FAIL)/
ist allerdings nicht so portabel. Und selbst in Perl ist es meiner Meinung nach ein dunkleres Merkmal als ein negativer Lookahead.-Mre=debug
sagt) , dass(?!)
in optimierte wird(*FAIL)
von Perl regex Optimierer (OPFAIL
nach-Mre=debug
). Ich glaube auch nicht, dass ich(*FAIL)
außerhalb von Perl 5 (und Perl 6, wo es heißt<!>
) gesehen habe.8 Zeichen
Wir benötigen einen String, der ein Zeichen enthält, das sowohl
a
als auch istb
, was offensichtlich unmöglich ist.quelle
/(?!x)x/
sieht noch unmöglicher aus ;-)5 Zeichen
Im Gegensatz zu jedem, der missbraucht
$
und^
... funktioniert dies tatsächlich in Perl:\A
Entspricht dem Anfang der Zeichenfolge.quelle
^
.6 Zeichen
Gestützt auf die Antwort von Sven Hohenstein .
quelle
8 Charaktere
Eine Wortgrenze (
\b
), die von 'Wort'-Zeichen (\w
- eines von[_a-zA-Z0-9]
) umgeben ist. Es ist nicht vergleichbar, da eines der Zeichen vor oder nach einer Wortgrenze kein "Wort" -Zeichen sein darf.Übrigens: Dies ähnelt dem unvergleichlichen Ausdruck
wo
\W
bedeutet nicht-'word‘Charakter.quelle
/
zählen. Siehe zum Beispiel OP's Eintrag . Es ist jedoch ein großartiger Einstieg!4 Zeichen
Sucht ein "a" nach dem Ende der Zeichenkette.
oder
Sucht nach a vor dem Anfang der Zeichenfolge.
quelle
^
und$
in "unzulässige" Positionen bewirkt nur, dass sie als gewöhnliche Zeichen behandelt werden. Ihr erstes Beispiel entspricht dem Literal$a
insed
und wahrscheinlich anderen Programmen.echo 'a^b' | grep 'a^b'
vs.echo 'a^b' | grep -E 'a^b'
. Check out 9.4.9 ERE Expression5 Zeichen
/$.^/
/$^/
wird mit einer leeren Zeichenfolge übereinstimmen, während ein Zeichen dazwischen nicht erforderlich ist.quelle
"$a^"
(oder irgendetwas anstelle von'a'
) in Perl ( und vielleicht sed ). Trotzdem eine schöne!$.
als die aktuelle Zeilennummernvariable interpretiert werden. Welche leer sein könnte, in welchem Fall wird dies sein/^/
.^
und$
'$^'
mit grep ausprobiert , aber leider stimmte es mit der Zeichenfolge überein'$^'
. Smartass grep.9 Zeichen
Ich bin mir nicht sicher,
/[^\S\s]/
sollte aber unübertroffen sein, da es sich nicht um einen Charakter handelt, sondern um mindestens einen davon.quelle
+
.6 Zeichen
Ich denke, dieser Regex, den ich gemacht habe, wird funktionieren:
Es entspricht einer Wortgrenze (
\b
), die keine Wortgrenze (\B
) ist. Was ist impos - muss ich dir das wirklich erklären?quelle
4 Zeichen
(Nur ECMAScript-Version)
In anderen Versionen ist dies keine gültige Zeichenklasse (das
]
wird als Zeichen in der Klasse betrachtet, daher ist der Ausdruck nicht gültig, da die Klasse niemals geschlossen wird), aber der ECMAScript-Standard akzeptiert leere Zeichenklassen. Da es sich um eine Klasse handelt, muss sie mit einem Zeichen übereinstimmen (leere Zeichenfolgen stimmen also nicht überein). Da jedoch kein einzelnes Zeichen enthalten ist, stimmt auch kein tatsächliches Zeichen überein.quelle
/[]{0}/
. (Ps. Obwohl meine eigene Antwort teilweise wie Ihre aussieht, lese ich Ihre tatsächlich, nachdem ich meine geschrieben habe.)/[]/.test("")
. es gibt falsch zurück. Eine Zeichenklasse kann niemals mit einer leeren Zeichenfolge übereinstimmen, auch wenn sie keine Zeichen enthält./[]{0}/
ist legal (in ECMAScript) und stimmt mit der leeren Zeichenfolge überein ... Ich bin mir jedoch nicht sicher, wie dies für meine Antwort relevant ist.6 Zeichen
Der Possessive Quantifier sucht nach so vielen Bs wie möglich, dann nach 1 weiteren. 6 Zeichen aber Symmetriepunkte?
quelle
6 Zeichen
Kein Gewinner, aber ich dachte, es hat Spaß gemacht. grep und Python spielen beide in diesem Fall, aber Perl scheint damit einverstanden zu sein.
Scheint sehr umsetzungsabhängig zu sein (was angesichts seiner Verrücktheit kaum verwunderlich ist). Bob berichtet weiter unten, dass es mit irgendetwas in der Regex-Engine von JavaScript übereinstimmt .
quelle
Vielleicht ein bisschen schummeln, aber ...
… Ist in POSIX regex in praktisch allen, wenn nicht allen Implementierungen unerreicht . BASIC RE und EXTENDED RE, gerade.
Und POSIX RE benötigt diese lästigen Schrägstriche und Flags, die PCRE hat, nicht.
quelle
0
funktioniert die Sohle in PERL nicht."0"=~0
ist wahr ...\0
ITYM? Ja, die meisten Perlre (1) - und PCRE-Implementierungen verwenden keine C-Strings, sondern Puffer mit Größenbeschränkung, in denen dieser Trick nicht funktioniert, aber die meisten POSIX RE-Implementierungen funktionieren mit C-Strings.5 Zeichen
Entspricht einer Zeichenfolge, die mit einem einzelnen Zeichen beginnt, bevor die Zeichenfolge beginnt.
quelle
".^"
re.findall(r'^.^', '.^', re.DEBUG)
^
und.
sind Metazeichen nicht wörtlich, die entkommen müssen4 Zeichen:
Funktioniert mit GNU grep 2.5.1 und egrep.
quelle
/.^/
= 4 Zeichen.//
? diese werden nicht überall benötigt/
zählen, siehe die ursprüngliche Frage ("einschließlich Schrägstriche und Flags") und den OP-Eintrag .Perl 6 (5 Zeichen)
Missbrauch von Sorta-Regeln (da reguläre Ausdrücke in Perl 6 unterschiedlich sind und von Natur aus nicht mit regulären Ausdrücken inkompatibel sind), ist mir aber egal.
<!>
Regel informiert Perl 6, dass der reguläre Ausdruck nicht übereinstimmt.quelle
6 Bytes
Eine Abkürzung für
(*FAIL)
, die von Perl-kompatiblen Regex-Engines unterstützt wird. Vielen Dank an @HamZa für den Hinweis.9 Bytes
Sollte mit jeder Regex-Engine funktionieren, die überhaupt Verben unterstützt. Ich bin nicht davon überzeugt, dass dies wirklich weiter golfen werden muss.
quelle
(*FAIL)
ist ein Verb, das immer fehlschlägt./(*F)/
:)4 Zeichen
Benötigt ein beliebiges Zeichen nach dem Ende der Zeichenfolge
quelle
$
ist nur am Ende des Musters etwas Besonderes.4 Zeichen mit Schrägstrichen 2 ohne
In der Regex-Engine der TXR-Sprache entspricht eine leere Zeichenklasse
[]
keinem Zeichen und daher keiner Zeichenfolge. Es verhält sich so, weil die Zeichenklasse eine Zeichenübereinstimmung erfordert und wenn sie leer ist, gibt dies an, dass kein Zeichen sie erfüllen kann.Eine weitere Möglichkeit ist es, die „Menge aller Zeichenkette einschließlich leer“ regex zu invertieren
/.*/
mit dem Komplement - Operator:/~.*/
. Das Komplement dieses Sets enthält überhaupt keine Zeichenketten und kann daher nicht mit irgendetwas übereinstimmen.Dies ist alles in der Manpage dokumentiert:
Die Schrägstriche sind per se nicht Bestandteil der Regex-Syntax. Sie sind nur Satzzeichen, die Regexes in der S-Ausdrucksnotation begrenzen. Zeuge:
quelle
6 Zeichen
(oder 4, je nachdem, wie Sie es sehen)
quelle
Dies ist ein 5-stelliger regulärer Ausdruck.
Es entspricht einer leeren Gruppe 1 oder mehrmals.
BEARBEITEN:
Meine Antwort für andere Geschmacksrichtungen wurde entfernt:
Alles, was keine Zahl in {} ist, stimmt mit dem Text überein.
Dieser stimmt mit ". {- 1}" überein.
quelle
5 Zeichen
Hoffe das klingt nicht dumm:
/[]+/
quelle
Eine Sache, die endet, bevor sie begonnen hat ...
quelle
""
, ist es nicht eine Zeichenfolge entspricht diese beide wörtlichen Zeichen enthalten:"$^"
.