RegEx-Golf: Alle Inhalte in einer Zeichenfolge abgleichen


10

Ihre Aufgabe ist es, eine RegEx zu schreiben, die mit allen Zeichenfolgen übereinstimmt.

Eine Zeichenfolge ist definiert als alles, was von zwei nicht entflohenen Zeichen umgeben ist (diese jedoch nicht einschließt) ".

A "kann entkommen werden \, was auch wieder entkommen kann.

Testfälle

string:  ab\c"defg\\\"hi"jkl"mn\\\\"opqrst""
matches:      ^^^^^^^^^^     ^^^^^^        ^ (the empty string)

Wertung

Die kürzeste Lösung gewinnt.

Technische Daten

  • Bitte geben Sie den verwendeten Geschmack an.
  • Der Eingang ist ausgeglichen ".
  • Es wird keine geben \, die unmittelbar vor einem Zeichenfolgenanfangsbegrenzer steht. Zum Beispiel müssten Sie nicht behandelnabc\"def"

1
Wird es \vor einer Schnur geben? Zum Beispiel abc\"def".
Jimmy23013

Sollte es zu jeder Zeichenfolge in einer Gruppe passen? Könnte ich zum Beispiel etwas schreiben, das zwei Übereinstimmungen enthält abc"de", eine ist dund die andere ist e?
Jimmy23013

Es ist erlaubt .
Undichte Nonne

Wird es leere Fäden geben?
Martin Ender

Ja, es wird leere Zeichenfolgen geben.
Undichte Nonne

Antworten:


3

PCRE, 21 20 15 19 Bytes

(.|^)"\K(\\.|[^"])*

Probieren Sie es hier aus.

Dies entspricht einem Zeichen (oder dem Anfang der Eingabe) vor dem beginnenden doppelten Anführungszeichen und setzt dann die Übereinstimmung zurück, um sicherzustellen, dass das doppelte Anführungszeichen nicht mit einer anderen Übereinstimmung geteilt wird.

PCRE, 25 23 Bytes

Vielen Dank an Martin Büttner für das Golfen von 2 Bytes.

(\\.|[^"])*+(?!"(?R)|$)

Probieren Sie es hier aus.

Erläuterung

(
    \\.|[^"]     # An escaped character, or a character that isn't a double quote
)*+              # Possessive zero-or-more quantifier, which means backtracking
                 # could not happen after first match is found. That means if \\.
                 # matched, it would never switch to [^"], because it is always a
                 # match if it just stopped after the \\. without backtracking.
(?!"(?R)|$)      # Make sure it is not followed by a double quote and another
                 # match, or the end of the input.

Beachten Sie, dass der Possessivquantifizierer ( *+) sichergestellt hat, dass der negative Lookahead immer nach einer ganzen Zeichenfolge oder einem ganzen Segment von Nicht-Zeichenfolgen beginnt.

Es gibt 4 Fälle:

  • Das Match beginnt irgendwo außerhalb einer Zeichenfolge. \\.würde niemals ein doppeltes Anführungszeichen gemäß der Klarstellung entsprechen. Es konnte nur kurz vor dem nächsten doppelten Anführungszeichen enden, das eine Zeichenfolge beginnt, oder vor dem Ende der Eingabe. In beiden Fällen schlägt der negative Lookahead fehl.
  • Das Match beginnt am Anfang einer Zeichenfolge. (\\.|[^"])*+würde mit einer vollständigen Zeichenfolge übereinstimmen. Das nächste Zeichen muss ein doppeltes Anführungszeichen sein und darf nicht das Ende der Eingabe sein. Nach dem doppelten Anführungszeichen befindet es sich außerhalb der Zeichenfolge, sodass es keine weitere Übereinstimmung geben kann. So passiert es den negativen Lookahead.
  • Das Match beginnt am Ende einer Zeichenfolge. Es entspricht einer leeren Zeichenfolge auf die gleiche Weise wie im vorherigen Fall. Aber es spielt nach der Klarstellung keine Rolle.
  • Das Match beginnt in der Mitte einer Zeichenfolge. Unmöglich, da sich Übereinstimmungen nicht überschneiden.

Würde (\\.|[^"])funktionieren?
Martin Ender

@ MartinBüttner, der alles außer "
Bálint

@ Bálint meinte ich anstelle von ([^\\"]|\\.), nicht als Komplettlösung.
Martin Ender

@ MartinBüttner Oh, ok
Bálint

Martins Vorschlag sollte funktionieren, da er \\.nur dann fehlschlägt, wenn kein Zeichen nach \(oder ein neues Zeilenzeichen, aber das kann mit einem Flag behoben werden) vorhanden ist und dieser Fall durch den negativen Rückblick abgedeckt wird. Der Possessivquantifizierer verhindert das Zurückverfolgen, sodass wir keinen anderen Fall betrachten müssen.
n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳

0

JavaScript, 24 Bytes

"([^"\\]*(?:\\.[^"\\]*)*)"

Gruppe 1 ist der Inhalt der Zeichenfolge.


Dies funktioniert bei maskierten Anführungszeichen überhaupt nicht und entspricht daher nicht der Spezifikation.
ATaco

Ah ja - Entschuldigung. Wie ist es damit?
Whothehellisthat

Schließen, aber keine Zigarre, Sie sollten nicht mit dem äußeren "s
ATaco

Ja, davor hatte ich Angst. Keine Möglichkeit, dies in JavaScript zu tun, vermute ich?
Whothehellisthat

Sie können es in einer Untergruppe erfassen
ATaco

0

JavaScript, 21 15 13 12 Bytes

"((\\?.)*?)"

Der Inhalt der Zeichenfolge befindet sich in Gruppe 1.

"   #start of string
(    #capturing group
 (
  \\?. #match character or escaped character
 )*?  #match as few as possible
)        
"   #end of string
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.