RegEx-golf: dopasuj całą zawartość w ciągu

10

Twoim zadaniem jest napisanie RegEx, który pasuje do wszystkiego wewnątrz ciągów.

Łańcuch jest zdefiniowany jako wszystko otoczone (ale nie wliczając) dwóch nieskalowanych ".

"Można uciekł \, które mogą również być ponownie uciekł.

Przypadki testowe

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

Punktacja

Najkrótsze rozwiązanie wygrywa.

Okular

  • Proszę podać zastosowany smak.
  • Wejście będzie zbalansowane ".
  • Nie będzie takiego, \który natychmiast poprzedzi separator rozpoczynający ciąg. Na przykład nie trzeba obsługiwaćabc\"def"
Leaky Nun
źródło
1
Czy będzie \przed sznurkiem? Na przykład abc\"def".
jimmy23013
Czy powinien pasować do każdego ciągu w jednej grupie? Na przykład, czy mogę napisać coś, co ma dwa dopasowania abc"de", jedno jest, da drugie jest e?
jimmy23013
To jest dozwolone .
Leaky Nun
Czy będą puste ciągi znaków?
Martin Ender,
Tak, będą puste ciągi.
Leaky Nun

Odpowiedzi:

3

PCRE, 21 20 15 19 bajtów

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

Wypróbuj tutaj.

To dopasowuje znak (lub początek danych wejściowych) przed początkowym podwójnym cytatem, a następnie resetuje dopasowanie, aby upewnić się, że podwójny cytat nie jest współdzielony z innym dopasowaniem.

PCRE, 25 23 bajtów

Podziękowania dla Martina Büttnera za grę w golfa na 2 bajtach.

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

Wypróbuj tutaj.

Wyjaśnienie

(
    \\.|[^"]     # 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.

Zauważ, że kwantyfikator dzierżawczy ( *+) upewniał się, że ujemne spojrzenie w przód zawsze zaczyna się po całym łańcuchu lub całym segmencie łańcucha.

Istnieją 4 przypadki:

  • Mecz rozpoczyna się w dowolnym miejscu poza ciągiem. \\.zgodnie z wyjaśnieniem nigdy nie pasowałby do podwójnego cytatu. Może zakończyć się tuż przed następnym podwójnym cudzysłowem, który rozpoczyna ciąg lub koniec danych wejściowych. Oba przypadki zawodzą negatywne spojrzenie w przyszłość.
  • Mecz rozpoczyna się na początku łańcucha. (\\.|[^"])*+pasowałby pełny ciąg. Następny znak musi być podwójnym cudzysłowiem i nie może być końcem wprowadzania. Po podwójnym cudzysłowie znajduje się poza ciągiem, więc nie może być kolejnym dopasowaniem. Więc mija negatywne spojrzenie w przyszłość.
  • Mecz rozpoczyna się na końcu ciągu. Dopasowuje pusty ciąg w taki sam sposób jak poprzedni przypadek. Ale to nie ma znaczenia zgodnie z wyjaśnieniem.
  • Mecz rozpoczyna się w środku łańcucha. Niemożliwe, ponieważ dopasowania się nie pokrywają.
jimmy23013
źródło
Czy (\\.|[^"])zadziała?
Martin Ender,
@ MartinBüttner, który pasuje do wszystkiego oprócz „
Bálint
@ Bálint miałem na myśli zamiast ([^\\"]|\\.)kompletnego rozwiązania.
Martin Ender,
@ MartinBüttner Och, ok
Bálint
Sugestia Martina powinna zadziałać, ponieważ \\.kończy się niepowodzeniem, gdy nie ma znaku po \(lub znaku nowej linii, ale można to naprawić za pomocą flagi), a ten przypadek jest objęty negatywnym spojrzeniem wstecz. Kwantyfikator dzierżawczy zapobiega cofaniu się, więc nie mamy innego przypadku do obejrzenia.
n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨d̷̰̀ĥ̷̳
0

JavaScript, 24 bajty

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

Grupa 1 to zawartość ciągu.

Kto to do cholery jest
źródło
To w ogóle nie działa z cytowanymi znakami ucieczki, a zatem nie spełnia specyfikacji.
ATaco
Ach tak - przepraszam. Co ty na to?
Whothehellisthat,
Blisko, ale nie cygar, nie powinny być dopasowane zewnętrzne "s
Ataco
Tak, tego się bałem. Zgaduję, że nie da się tego zrobić w JavaScript.
Whothehellisthat,
Możesz uchwycić go w podgrupie
ATaco
0

JavaScript, 21 15 13 12 bajtów

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

Zawartość ciągu znajduje się w grupie 1.

"   #start of string
(    #capturing group
 (
  \\?. #match character or escaped character
 )*?  #match as few as possible
)        
"   #end of string
12Me21
źródło