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


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.


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


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.


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.


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.


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.


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.


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?


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.


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?


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 .


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.


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


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.


/.^/= 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.


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.


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


Ä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

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}/

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.


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: /[]+/


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


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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.