2011-01-26 12 views

risposta

4

Questo dovrebbe farlo, utilizzando un Negative Lookahead:

"(?!, -)([^"]*)"(?!, -) 

Un po 'icky, ma funziona. Vuoi assicurarti che la citazione non sia seguita dalla tua stringa, altrimenti la partita inizierà alle virgolette di chiusura.

http://rubular.com/r/yFMyUKJOHL

+1

Questa è la soluzione migliore finora - fallirà solo se una stringa inizia per ', -' che non è molto probabile ... –

+0

@Tim - ohh. Un buon punto, ma poi il' "([^ "] *)" (?!, -) 'il risultato apparentemente sbagliato potrebbe essere considerato valido, dal momento che si introduce ambiguità. – Kobi

0

Aggiungere (?!...) alla fine della regex:

"([^"\n]*)"(?!, -) 
+1

ho pensato, anche, ma questo funziona solo se v'è esattamente un paio di citazioni per linea ... –

+0

Ho anche sostituito '[^"] 'con' [^ "\ n]' per prevenire le newline in qoutes. Un altro modo per evitarlo potrebbe essere qualcosa come "" (\ b [^ "] * \ b)" (?!, -) '. –

1

Regex

"(.*?)"(?!, -)

lavoro Esempio

http://rubular.com/r/9kOmZLxLfy

+0

Questo funziona solo se c'è al massimo una coppia di virgolette per riga. –

+0

.. e, non funziona se le virgolette possono estendersi su più righe.Se questi non sono i casi, questa è una buona soluzione – Kobi

+0

Ho appena migliorato la regex OP per fare ciò che voleva.Tutti questi difetti che menzioni sono presenti nel regex originale anche –

1

Questo è analizzabile nel vostro contesto, il suo tempo indeterminato. L'unico modo per analizzarlo è quello di consumare il non e il bene, ma è ancora una premessa non valida.

/"([^"]*?)"(?!, -)|"[^"]*?"(?=, -)/

Poi controlla per il gruppo di cattura 1 su ogni partita, qualcosa di simile:

$rx = qr/"([^"]*?)"(?!, -)|"[^"]*?"(?=, -)/; 
while (' "ingnore me", - "but not me" ' =~ /$rx/g) { 
    print "'$1'\n" if defined $1 
} 
Problemi correlati