Le espressioni regolari sono senza stato. Tracciare se si è all'interno di virgolette o no è informazioni di stato. Pertanto, è impossibile gestirlo correttamente utilizzando solo una singola espressione regolare. (Si noti che alcune implementazioni "espressioni regolari" aggiungere estensioni che possono rendere questo possibile,. Sto parlando solo di "veri" espressioni regolari qui)
Farlo con due espressioni regolari è possibile, anche se, a condizione che sei disposto a modificare la stringa originale oa lavorare con una copia di essa.In Perl:
$string =~ s/['"][^'"]*['"]//g;
my $match_count = $string =~ /:/g;
Il primo troverà ogni sequenza costituita da una citazione, seguita da un numero qualsiasi di caratteri non preventivo e terminato da una seconda citazione, e rimuovere tutti tali sequenze dalla stringa. Questo eliminerà tutti i due punti che sono tra virgolette. (something:"firstValue":'secondValue'
diventa something::
e something:'no:match'
diventa something:
)
La seconda fa un semplice conteggio dei rimanenti due punti, che saranno quelli che non erano all'interno apici per iniziare.
Solo il conteggio dei due punti non quotati non sembra una cosa particolarmente utile da fare nella maggior parte dei casi, tuttavia, quindi sospetto che il tuo vero obiettivo è dividere la stringa in campi con due punti come delimitatore di campo, nel qual caso questa soluzione basata su regex non è adatta, in quanto distruggerà tutti i dati nei campi citati. In tal caso, è necessario utilizzare un parser reale (la maggior parte dei parser CSV consente di specificare il delimitatore e sarebbe l'ideale per questo) o, nel peggiore dei casi, percorrere la stringa carattere per carattere e dividerlo manualmente.
Se ci dici la lingua che stai utilizzando, sono sicuro che qualcuno potrebbe suggerire una buona libreria di parser per quella lingua.
fonte
2009-09-18 10:17:10
@Jaco: 1) quale lingua? 2) Non è più semplice dividere prima la stringa su ['"] in modo da poter controllare tutti gli elementi non numerati nell'array – Huppie
Sarebbe meglio con un parser .. – Gumbo
@Gumbo ... Immagino che sia il mio consiglio: leggere byte-saggio e utilizzare una bandiera se si è tra virgolette – Scoregraphic