2009-08-29 11 views
15

Innymi słowy, mam ciąg jak:Co to jest wyrażenie regularne pasujące do niczego oprócz podwójnego cudzysłowu nie poprzedzonego ukośnikiem odwrotnym?

„czegokolwiek, uciekł cudzysłowia: \” Tak”coś tu nie być dopasowane

Jak dopasować wszystko wewnątrz cudzysłowów

.?

myślę

^"((?<!\\)[^"]+)"

Ale moja głowa kręci się, że powinien być dodatni lub ujemny lookbehind? czy to działa na wszystkich?

Jak mogę dopasować dowolne znaki oprócz podwójnego cudzysłowu NIE poprzedzonego ukośnikiem odwrotnym?

Odpowiedz

27

Nie lookbehind konieczne:

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

Więc: mecz cytaty, a wewnątrz nich: każdy znak z wyjątkiem cytat ([^"]) lubzbiegłego cytatem (\\"), dowolnie wiele razy (*).

+4

Jak wspomniano o chaosie, prawdopodobnie również chcesz obsłużyć podwójne ukośniki odwrotne (choć nie zostało to określone przez PO). –

+0

Hah, znowu zaczynam, komplikując problem. Nie myślałem o tak prostym rozwiązaniu, dzięki! –

+1

Prawdopodobnie użyłbym "\\". aby umożliwić ukośnikowi odwrotnemu uniknięcie pojedynczego znaku, który zapobiega dezorientacji regexu przez ukośnik odwrotny, ukośnik odwrotny, (blisko) podwójny cudzysłów. Najwyraźniej potrzebujesz bardziej złożonego wyrażenia zamiast kropki, jeśli chcesz obsługiwać ósemkowe lub szesnastkowe ucieczki, lub znaki unikodowe, lub ... –

2

"Nie poprzedza" przekłada się bezpośrednio na "negatywny lookbehind", więc warto uzyskać (?<!\\)".

Chociaż jest to pytanie, które może zrujnować Twój dzień: co z ciągiem znaków "foo\\"? To znaczy, podwójny cudzysłów poprzedzony dwoma odwrotnymi ukośnikami, w których w najbardziej uciekających składniach chcielibyśmy zanegować specjalne znaczenie drugiego ukośnika wstecznego, poprzedzając go pierwszym.

Takie rzeczy powodują, że wyrażeń regularnych nie zastępujemy analizatorów składni.

+0

Jestem prawie pewny, że negatywny lookbehind jest droższy niż mój rozwiązanie, które wykorzystuje ujemny znak c lass i alternacja. To trywialny przypadek dla silników regex. –

+0

Najprawdopodobniej tak. – chaos

+0

Co z tym? '^" ([^ "] | (?

Powiązane problemy