Domanda

Lasciami prefigurare dicendo che sono un dilettante completo quando si tratta di RegEx e ho iniziato solo pochi giorni fa. Sto cercando di risolvere un problema di formattazione di un file e ho avuto un intoppo con un particolare tipo di dati. Il file di input è strutturato in questo modo:

Two words,Word,Word,Word,"Number, number"

Quello che devo fare è formattarlo in questo modo ...

"Two words","Word",Word","Word","Number, number"

Ho avuto un modello RegEx di

s/,/","/g

funziona, tranne che sostituisce anche la virgola nella sezione Numero, numero già citata, che causa la separazione del campo e interrompe il file. In sostanza, devo modificare il mio modello per sostituire una virgola con ", " [quote quote quote], ma solo quando la virgola non è seguita da uno spazio. Nota che gli altri campi non avranno mai uno spazio dopo la virgola, ma solo l'elenco dei numeri delimitati.

Sono riuscito a scrivere

s/,[A-Za-z0-9]/","/g

che, pur corrispondendo alle stringhe appropriate, sostituisce la virgola E la lettera seguente. Ho sentito parlare di backreferences e pensi che potrebbe essere quello che devo usare? La mia comprensione era quella

s/(,)[A-Za-z0-9]\b

dovrebbe funzionare, ma non lo è.

Qualcuno ha un'idea?

È stato utile?

Soluzione

s /, ([^]) / ", " $ 1 / corrisponderà a " , " seguito da un "non-uno-spazio", che cattura il non-uno-spazio, quindi sostituisce il tutto con la parte catturata.

A seconda del motore regex che stai utilizzando, potresti scrivere \ 1 o altre cose invece di $ 1 .

Se stai usando Perl o hai accesso a un motore regex con lookahead negativo, s /, (?!) / ", " / (a " , " non seguito da uno spazio) funziona.

Il tuo input sembra CSV, tuttavia, e se lo è, sarebbe meglio analizzarlo con un vero parser CSV piuttosto che con regex. Ci sono molti altri casi angolari di cui preoccuparsi.

Altri suggerimenti

La mia esperienza è stata che questo non è un grande uso delle regex. Come già detto, i file CSV sono gestiti meglio dai veri parser CSV. Non hai taggato una lingua, quindi è difficile da dire, ma in perl, uso Text :: CSV_XS o DBD :: CSV (permettendomi di accedere a un file CSV come se fosse una tabella, che, ovviamente, usa Text :: CSV_XS sotto le copertine). Molto più semplice del mio, e molto più robusto dell'uso delle regex.

Questa domanda è simile a: Sostituisci i pattern all'interno dei delimitatori utilizzando una chiamata di espressione regolare .

Potrebbe funzionare:

s/"([^"]*)"|([^",]+)/"$1$2"/g

Sembra che tu stia usando Sed.

Mentre il tuo modello sembra essere un po 'incoerente, suppongo che vorresti che ogni elemento separato da virgole avesse delle citazioni attorno. Altrimenti, stai esaminando aree di complessità computazionale che le espressioni regolari non sono destinate a gestire.

Tramite sed, il tuo comando sarebbe:

  sed 's/[ \"]*,[ \"]*/\", \"/g'

Nota che dovrai ancora mettere le virgolette all'inizio e alla fine della stringa.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top