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"

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

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, 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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.