2009-08-29 13 views
15

In altre parole, ho una stringa del tipo:Qual è la regex per abbinare qualsiasi cosa eccetto una doppia citazione non preceduta da una barra rovesciata?

"nulla, sfuggito virgolette doppie: \", sì" tutto qui non per essere abbinato

Come posso abbinare tutto dentro le virgolette

.?

sto pensando

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

Ma la mia testa gira, che dovrebbe essere positivo o negativo lookbehind? o fUNZIONA a tutti?

Come faccio a trovare qualsiasi carattere tranne una doppia virgola NON preceduta da una barra rovesciata?

risposta

27

No lookbehind necessaria:

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

Quindi: partita citazioni, e al loro interno: ogni personaggio, tranne una citazione ([^"]) o un preventivo escape (\\"), un numero arbitrario di volte (*).

+4

Come il caos menzionato, probabilmente si desidera anche gestire i doppi backslash separatamente (anche se non è stato specificato dall'OP). –

+0

Hah, eccomi di nuovo, complicando troppo il problema. Non ho pensato a una soluzione così semplice, grazie! –

+1

Probabilmente userò "\\". per consentire al backslash di sfuggire a ogni singolo carattere successivo, che impedisce alla regex di essere confusa da backslash, backslash, (close) double quote. Chiaramente, hai bisogno di un'espressione più complessa al posto del punto se vuoi gestire fughe ottali o esadecimali, o fughe Unicode, o ... –

2

"Non preceduto da" si traduce direttamente in "lookbehind negativo", quindi è necessario (?<!\\)".

Anche se qui c'è una domanda che potrebbe rovinarti la giornata: che dire della stringa "foo\\"? Cioè, una doppia citazione preceduta da due barre inverse, dove nella maggior parte delle sintassi di escape vorremmo negare il significato speciale della seconda barra inversa precedendola con la prima.

Questo tipo di cose è un po 'il motivo per cui le regex non sono un sostituto per i parser.

+0

Sono abbastanza sicuro però che un lookbehind negativo è più costoso del mio soluzione che utilizza un carattere negativo c ragazza e un'alternanza. Questo è un caso banale per i motori regex. –

+0

Molto probabilmente, sì. – chaos

+0

Che ne pensi di questo? '^" ([^ "] | (?

Problemi correlati