Come utilizzare la sostituzione di stringhe in Ruby

Dividere una stringa è solo un modo per manipolare i dati di stringa. È inoltre possibile effettuare sostituzioni per sostituire una parte di una stringa con un'altra stringa. Ad esempio, in una stringa di esempio (foo, bar, baz) la sostituzione di "foo" con "boo" in produrrebbe "boo, bar, baz". Puoi fare questo e molte altre cose usando il sub e gsub metodo nella classe di stringhe.

Molte opzioni per la sostituzione di Ruby

I metodi di sostituzione sono disponibili in due varietà. Il sub il metodo è il più semplice dei due e presenta il minor numero di sorprese. Sostituisce semplicemente la prima istanza del modello designato con la sostituzione.

Mentre sub sostituisce solo la prima istanza, il gsub Il metodo sostituisce ogni istanza del modello con la sostituzione. Inoltre, entrambi sub e gsub avere sub! e gsub! controparti. Ricorda, metodi in Rubino quella fine in un punto esclamativo modifica la variabile in atto anziché restituire una copia modificata.

Cerca e sostituisci

L'uso più basilare dei metodi di sostituzione è quello di sostituire una stringa di ricerca statica con una stringa di sostituzione statica. Nell'esempio sopra, "foo" è stato sostituito con "boo". Questo può essere fatto per la prima occorrenza di "pippo" nella stringa usando il

instagram viewer
sub metodo o con tutte le occorrenze di "pippo" usando il gsub metodo.

#! / usr / bin / env ruby
a = "foo, bar, baz"
b = a.sub ("foo", "boo")
mette b
$ ./1.rb
foo, bar, baz
gsub $ ./1.rb
ciao, bar, baz

Ricerca flessibile

La ricerca di stringhe statiche può andare solo così lontano. Alla fine, ti imbatterai in casi in cui un sottoinsieme di stringhe o le stringhe con componenti opzionali dovranno essere abbinate. I metodi di sostituzione possono ovviamente abbinare espressioni regolari anziché stringhe statiche. Ciò consente loro di essere molto più flessibili e di abbinare praticamente qualsiasi testo tu possa immaginare.

Questo esempio è un po 'più mondo reale. Immagina un insieme di valori separati da virgola. Questi valori vengono inseriti in un programma di tabulazione su cui non si ha alcun controllo (chiuso fonte). Anche il programma che genera questi valori è di tipo chiuso, ma sta producendo dati formattati in modo errato. Alcuni campi hanno spazi dopo la virgola e questo causa l'interruzione del programma tabulator.

Una possibile soluzione è scrivere un programma Ruby che funga da "colla" o filtro tra i due programmi. Questo programma Ruby risolverà eventuali problemi nella formattazione dei dati in modo che il tabulatore possa fare il suo lavoro. Per fare questo, è abbastanza semplice: sostituire una virgola seguita da un numero di spazi con solo una virgola.

#! / usr / bin / env ruby
STDIN.each do | l |
l.gsub! (/, + /, ",")
mette l
fine
gsub $ cat data.txt
10, 20, 30
12.8, 10.4,11
gsub $ cat data.txt | ./2.rb
10,20,30
12.8,10.4,11

Sostituzioni flessibili

Ora immagina questa situazione. Oltre alla formattazione minore errori, il programma che produce i dati produce dati numerici in notazione scientifica. Il programma tabulator non lo capisce, quindi dovrai sostituirlo. Ovviamente, un semplice gsub non farà qui perché la sostituzione sarà diversa ogni volta che la sostituzione viene effettuata.

Fortunatamente, i metodi di sostituzione possono richiedere un blocco per gli argomenti di sostituzione. Per ogni volta che viene trovata la stringa di ricerca, il testo corrispondente alla stringa di ricerca (o regex) viene passato a questo blocco. Il valore prodotto dal blocco viene utilizzato come stringa di sostituzione. In questo esempio, un numero in virgola mobile in forma di notazione scientifica (come 1.232e4) viene convertito in un numero normale con un punto decimale. La stringa viene convertita in un numero con to_f, quindi il numero viene formattato utilizzando una stringa di formato.

#! / usr / bin / env ruby
STDIN.each do | l |
l.gsub! (/-?\d+\.\d+e-?\d+/) do | n |
"% .3f"% n.to_f
fine
l.gsub! (/, + /, ",")
mette l
fine
gsub $ cat floatdata.txt
2.215e-1, 54, 11
3.15668e6, 21, 7
gsub $ cat floatdata.txt | ./3.rb
0.222,54,11
3156680.000,21,7

Non hai familiarità con le espressioni regolari?

Facciamo un passo indietro e guardiamo quello espressione regolare. Sembra criptico e complicato, ma è molto semplice. Se non hai familiarità con le espressioni regolari, possono essere piuttosto criptiche. Tuttavia, una volta che li conosci, sono metodi semplici e naturali per descrivere il testo. Esistono numerosi elementi e molti di essi hanno quantificatori.

L'elemento principale qui è il \ d classe di caratteri. Questo corrisponderà a qualsiasi cifra, i caratteri da 0 a 9. Il quantificatore + viene utilizzato con la classe di caratteri numerici per indicare che una o più di queste cifre devono corrispondere in una riga. Hai tre gruppi di cifre, due separati da un "."e l'altro separato dalla lettera"e"(per esponente).

Il secondo elemento fluttuante è il carattere meno, che utilizza il "?" quantificatore. Questo significa "zero o uno" di questi elementi. Quindi, in breve, potrebbero esserci o meno segni negativi all'inizio del numero o dell'esponente.

Gli altri due elementi sono i. carattere (punto) e il carattere e personaggio. Combina tutto questo e otterrai un'espressione regolare (o un insieme di regole per la corrispondenza del testo) che corrisponde ai numeri in forma scientifica (come 12.34e56).

instagram story viewer