Kürzester nicht übereinstimmender regulärer Ausdruck

59

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ß!

xem
quelle
Dies hat mich zu einer Frage inspiriert. Ich werde allerdings ein paar Tage warten. Ich möchte nicht, dass 2 Regex-Fragen gleichzeitig aktiv sind
Cruncher
13
"Gültig" nach welcher Implementierung? Ich habe gerade eine amüsante gefunden, mit der Perl einverstanden ist (und die gemäß der einzigen RE-Grammatik gültig ist, die ich finden kann , aber die grep- und Pythons re-Modul ablehnen.
Josh Caswell
1
Ja, welche Dialekte von Regex? Es gibt viele, viele verschiedene.
Hippietrail
1
Aber was ist mit den Namen der Präsidenten? xkcd.com/1313
Carl Witthoft
@CarlWitthoft Sie müssen ein Programm sein, um an diesem Wettbewerb teilnehmen zu können: codegolf.stackexchange.com/q/17718/2180
Stand vom

Antworten:

53

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.

Nate Eldredge
quelle
+1 - Dies ist wahrscheinlich die kürzeste Antwort, die weithin portabel ist (zusammen mit /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)
Martin Ender
@m.buettner: Danke. Primo /(*FAIL)/ist wahrscheinlich klarer. (Und man perlregab es tatsächlich durch Erwähnung, dass meine tatsächlich zu seiner internen erweitert.)
Nate Eldredge
/(*FAIL)/ist allerdings nicht so portabel. Und selbst in Perl ist es meiner Meinung nach ein dunkleres Merkmal als ein negativer Lookahead.
Martin Ender
3
Heutzutage gibt es fast alle gängigen (von Perl inspirierten) Varianten, während ich diese Kontrollverben nur in Perl gesehen habe.
Martin Ender
1
In der Tat, Perl - Dokumentation (und -Mre=debugsagt) , dass (?!)in optimierte wird (*FAIL)von Perl regex Optimierer ( OPFAILnach -Mre=debug). Ich glaube auch nicht, dass ich (*FAIL)außerhalb von Perl 5 (und Perl 6, wo es heißt <!>) gesehen habe.
Konrad Borowski
39

8 Zeichen

/(?=a)b/

Wir benötigen einen String, der ein Zeichen enthält, das sowohl aals auch ist b, was offensichtlich unmöglich ist.

Peter Taylor
quelle
19
/(?!x)x/sieht noch unmöglicher aus ;-)
Howard
@PeterTaylor wo?
o0 '.
@Lohoris, wo was?
Peter Taylor
@PeterTaylor, wo hat er diese absurden Regeln hingelegt, von denen du sprichst? Ich konnte sie nicht finden.
o0 '.
7
Jungs, entschuldigen Sie die Zählung, die ich gewählt habe. Ich dachte, es wäre einfacher, Schrägstriche einzufügen, weil die optionalen Flags nach ihnen kommen könnten.
Xem
31

5 Zeichen

Im Gegensatz zu jedem, der missbraucht $und ^... funktioniert dies tatsächlich in Perl:

/V\A/

\A Entspricht dem Anfang der Zeichenfolge.

boothby
quelle
Es funktioniert auch mit ^.
Tomas
28

8 Charaktere

/\w\b\w/

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

/\W\b\W/

wo \Wbedeutet nicht-'word‘Charakter.

Sven Hohenstein
quelle
Dies sind nach den Regeln des Wettbewerbs 8 Zeichen, da die Schrägstriche /zählen. Siehe zum Beispiel OP's Eintrag . Es ist jedoch ein großartiger Einstieg!
Josh Caswell
Es könnte auch ein Gewinner sein (oder mit Peter Taylors Eintrag verknüpft sein ), da einige der kürzeren Einträge implementierungsabhängige Probleme haben !
Josh Caswell
Sehr elegant! Ich dachte, es muss so etwas geben!
Tomas
22

4 Zeichen

/$a/

Sucht ein "a" nach dem Ende der Zeichenkette.

oder

/a^/

Sucht nach a vor dem Anfang der Zeichenfolge.

xem
quelle
20
Warum die Frage posten, wenn Sie wissen, dass es eine Zwei-Zeichen-Lösung gibt?
Peter Taylor
3
@ Howard: Das stimmt mit einer leeren Zeichenfolge überein
ProgramFOX
10
Warum finde ich diese Probleme immer, wenn eine unschlagbare Lösung gefunden wurde :(
Cruncher
43
-1: Das Setzen ^und $in "unzulässige" Positionen bewirkt nur, dass sie als gewöhnliche Zeichen behandelt werden. Ihr erstes Beispiel entspricht dem Literal $ain sedund wahrscheinlich anderen Programmen.
Ben Jackson
2
@Ben Jackson, das gilt nicht für POSIX EREs. Versuchen echo 'a^b' | grep 'a^b'vs. echo 'a^b' | grep -E 'a^b'. Check out 9.4.9 ERE Expression
Anchoring
21

5 Zeichen

/$.^/

/$^/ wird mit einer leeren Zeichenfolge übereinstimmen, während ein Zeichen dazwischen nicht erforderlich ist.

Brian Glaz
quelle
6
Dies entspricht leider "$a^"(oder irgendetwas anstelle von 'a') in Perl ( und vielleicht sed ). Trotzdem eine schöne!
Josh Caswell
@JoshCaswell: Ich denke, Perl könnte $.als die aktuelle Zeilennummernvariable interpretiert werden. Welche leer sein könnte, in welchem ​​Fall wird dies sein /^/.
MvG
Ein Zeichen 'zwischen' bedeutet nur eine Zeichenfolge mit einem Zeichen.
JWG
3
@jwg beachte den getauschten ^und$
mniip
Ich habe das Muster '$^'mit grep ausprobiert , aber leider stimmte es mit der Zeichenfolge überein '$^'. Smartass grep.
Joeytwiddle
19

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.

user14325
quelle
Das brauchst du nicht +.
Peter Taylor
10
/ [^ \ S \ s] / = 9 Zeichen
xem
19

6 Zeichen

Ich denke, dieser Regex, den ich gemacht habe, wird funktionieren:

/\b\B/

Es entspricht einer Wortgrenze ( \b), die keine Wortgrenze ( \B) ist. Was ist impos - muss ich dir das wirklich erklären?

Der Typ mit dem Hut
quelle
Sucht dieser nicht nach einer Wortgrenze, gefolgt von einer Nicht-Wortgrenze?
Grexter89
1
@ grexter89 Ja, aber sie dürfen keine Zeichen dazwischen haben. dh die Grenze und die Nichtgrenze müssen den gleichen Raum einnehmen.
Der Kerl mit dem Hut
2
Ich mag dieses. Guter Fang.
Primo
18

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.

Martin Ender
quelle
Würde dies nicht mit einer leeren Zeichenfolge übereinstimmen, obwohl Sie sagen, dass sie mit einem Zeichen übereinstimmen muss? Oder denken Sie , das ist illegal: /[]{0}/. (Ps. Obwohl meine eigene Antwort teilweise wie Ihre aussieht, lese ich Ihre tatsächlich, nachdem ich meine geschrieben habe.)
nl-x
@ nl-x fügen Sie diesen in Ihre Browser-Konsole: /[]/.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.
Martin Ender
Scheitert in Ruby 2.0
Nakilon
@Nakilon tut es natürlich. Ruby implementiert die ECMAScript-Variante nicht.
Martin Ender
15

6 Zeichen

/b++b/

Der Possessive Quantifier sucht nach so vielen Bs wie möglich, dann nach 1 weiteren. 6 Zeichen aber Symmetriepunkte?

VBCPP
quelle
Huh ... Ich habe gerade eine neue Funktion gelernt. Anscheinend sind meine Regex-Fähigkeiten schlecht veraltet. Danke und +1.
Ilmari Karonen
8

6 Zeichen

/(\1)/

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 .

Josh Caswell
quelle
Die .NET-Regex-Engine scheint dies zu akzeptieren.
Bob
Und es passt immer (eine leere Zeichenfolge), egal welche Eingabe auf JS
Bob
8

Vielleicht ein bisschen schummeln, aber ...

\0

… 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.

Mirabilos
quelle
+1 Gut !! Leider 0funktioniert die Sohle in PERL nicht. "0"=~0ist wahr ...
Tomas
einziger \0ITYM? 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.
Mirabilos
5

5 Zeichen

/^.^/

Entspricht einer Zeichenfolge, die mit einem einzelnen Zeichen beginnt, bevor die Zeichenfolge beginnt.

P̲̳x͓L̳
quelle
6
".^"
Passt
@boothby: In welcher Sprache passt das? in Python nicht. re.findall(r'^.^', '.^', re.DEBUG)
P̲̳x͓L̳
8
+1 für die Verwendung des Manga-Operators (siehe stackoverflow.com/questions/3618340/… )
Prototyp
@boothby ^und .sind Metazeichen nicht wörtlich, die entkommen müssen
P̲̳x͓L͓
1
In Perl ist es kaputt. Diese Frage hätte wirklich Grundregeln für die Sprache setzen müssen.
Stand
5

4 Zeichen:

/.^/

Funktioniert mit GNU grep 2.5.1 und egrep.

RSFalcon7
quelle
/.^/= 4 Zeichen.
Alexey Popkov
Warum brauchst du das //? diese werden nicht überall benötigt
;-)
Die Schrägstriche /zählen, siehe die ursprüngliche Frage ("einschließlich Schrägstriche und Flags") und den OP-Eintrag .
Alexey Popkov
richtig! Ich vermisse gelesen :(
RSFalcon7
Nein, aus dem gleichen Grund wie im Folgenden: Tatsächlich ist „^“ nur am Anfang des Musters etwas Besonderes. Jedes "^" nach irgendetwas anderem muss nicht maskiert werden, daher ist diese Antwort falsch.
Mirabilos
4

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.

Konrad Borowski
quelle
4

6 Bytes

/(*F)/

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

/(*FAIL)/

Sollte mit jeder Regex-Engine funktionieren, die überhaupt Verben unterstützt. Ich bin nicht davon überzeugt, dass dies wirklich weiter golfen werden muss.

primo
quelle
1
Wie funktioniert das?
Stand
@boothby (*FAIL)ist ein Verb, das immer fehlschlägt.
Primo
@ Primo Sie könnten nur verwenden /(*F)/:)
HamZa
4

4 Zeichen

/$./

Benötigt ein beliebiges Zeichen nach dem Ende der Zeichenfolge

c0de Freak
quelle
Ähnlich wie die beiden anderen, $ist nur am Ende des Musters etwas Besonderes.
Mirabilos
3

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:

   nomatch
          The  nomatch  regular  expression  represents  the empty set: it
          matches no strings at all, not even the empty string.  There  is
          no  dedicated  syntax  to  directly express nomatch in the regex
          language.  However, the empty character class []  is  equivalent
          to nomatch, and may be considered to be a notation for it. Other
          representations of nomatch are possible: for instance, the regex
          ~.* which is the complement of the regex that denotes the set of
          all possible strings, and thus denotes the empty set. A  nomatch
          has  uses;  for instance, it can be used to temporarily "comment
          out" regular expressions. The regex ([]abc|xyz) is equivalent to
          (xyz), since the []abc branch cannot match anything. Using [] to
          "block" a subexpression allows you to leave it  in  place,  then
          enable it later by removing the "block".

Die Schrägstriche sind per se nicht Bestandteil der Regex-Syntax. Sie sind nur Satzzeichen, die Regexes in der S-Ausdrucksnotation begrenzen. Zeuge:

# match line of input with x variable, and then parse that as a regex
#
$ txr -c '@x
@(do (print (regex-parse x)) (put-char #\newline))' -
ab.*c                               <- input from tty: no slashes.
(compound #\a #\b (0+ wild) #\c)    <- output: AST of regex
Kaz
quelle
danke für deine antwort und sorry nochmal für die schrägstrichzählung. Ich dachte, es wäre einfacher, sie einzubeziehen, wenn die Leute Flaggen benutzen würden.
Xem
1

6 Zeichen

(oder 4, je nachdem, wie Sie es sehen)

/{,0}/
Tercy
quelle
Scheitert in Ruby 2.0
Nakilon
In welchen Regex-Implementierungen führt dies nicht zu einem Fehler?
Peter Taylor
Ich habe es nur mit PHP's preg_match getestet.
Tercy
1

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:

/.{-1}/

Alles, was keine Zahl in {} ist, stimmt mit dem Text überein.

Dieser stimmt mit ". {- 1}" überein.

Ismael Miguel
quelle
Beachten Sie, dass dies nur in der ECMAScript-Variante funktioniert. Bei den meisten (allen?) Anderen ist es kein gültiger Ausdruck.
Martin Ender
Ist es nicht ungültig?
Wasi
@Wasi nicht in ECMAScript-konformen Geschmacksrichtungen
Martin Ender
0

5 Zeichen

Hoffe das klingt nicht dumm: /[]+/

nl-x
quelle
Nee. Kein gültiger regulärer Ausdruck.
Der Mann mit dem Hut
@ RyanCarlson Es ist gültig und legal ... Zumindest in Ecmascript.
nl-x
-1
/$^/

Eine Sache, die endet, bevor sie begonnen hat ...

simon
quelle
7
Entspricht der leeren Zeichenfolge (in einigen RE-Implementierungen jedoch).
Josh Caswell
1
Deine Implementierung ist kaputt :)
simon
2
Lass es Guido lieber wissen .
Josh Caswell
7
Als noch wichtiger ist , Ben Jackson darauf hingewiesen , in Perl, wo es nicht übereinstimmt "", ist es nicht eine Zeichenfolge entspricht diese beide wörtlichen Zeichen enthalten: "$^".
Josh Caswell
+1 Ich wollte nur das Gleiche posten! @Josh, es funktioniert in PERL und es passt nicht zu einer leeren Zeichenkette! Bens Kommentar ist kaputt, antwortete ich.
Tomas