Utilizzando il metodo Split

Come forse già saprai, le stringhe in Ruby sono quelle che sono conosciute come oggetti di prima classe che usano una serie di metodi per interrogazioni e manipolazioni.

Una delle azioni di manipolazione delle stringhe più basilari è quella di dividere una stringa in più sottostringhe. Questo sarebbe fatto, ad esempio, se hai una stringa come"foo, bar, baz" e vuoi le tre corde "foo", "bar" e "baz". Il Diviso il metodo della classe String può farlo per te.

L'utilizzo di base di "Split"

L'uso più basilare di Diviso Il metodo consiste nel dividere una stringa in base a un singolo carattere o a una sequenza statica di caratteri. Se il primo argomento di split è una stringa, i caratteri in quella stringa vengono utilizzati come delimitatore del separatore di stringhe, mentre nei dati delimitati da virgola, la virgola viene utilizzata per separare i dati.

#! / usr / bin / env ruby
str = "foo, bar, baz"
mette str.split (",")
$ ./1.rb
foo
bar
baz

Aggiungi flessibilità con le espressioni regolari

Esistono modi più semplici per delimitare la stringa. L'uso di un'espressione regolare come delimitatore rende il metodo split molto più flessibile.

Ancora una volta, prendi ad esempio la stringa "foo, bar, baz". C'è uno spazio dopo la prima virgola, ma non dopo la seconda. Se la stringa "," viene utilizzata come delimitatore, esisterà comunque uno spazio all'inizio della stringa "bar". Se viene utilizzata la stringa "," (con uno spazio dopo la virgola), corrisponderà solo alla prima virgola poiché la seconda virgola non ha uno spazio dopo di essa. È molto limitante.

La soluzione a questo problema è utilizzare un'espressione regolare come argomento delimitatore anziché una stringa. Le espressioni regolari consentono di abbinare non solo sequenze statiche di caratteri ma anche numeri indeterminati di caratteri e caratteri opzionali.

Scrivere espressioni regolari

Quando scrivi un'espressione regolare per il tuo delimitatore, il primo passo è descrivere a parole qual è il delimitatore. In questo caso, la frase "una virgola che potrebbe essere seguita da uno o più spazi" è ragionevole.

Ci sono due elementi in questa regex: la virgola e gli spazi opzionali. Gli spazi useranno il quantificatore * (asterisco o asterisco), che significa "zero o più". Qualsiasi elemento che precede questo corrisponderà zero o più volte. Ad esempio, la regex /un*/ corrisponderà a una sequenza di zero o più caratteri "a".

#! / usr / bin / env ruby
str = "foo, bar, baz"
mette str.split (/, * /)
$ ./2.rb
foo
bar
baz

Limitare il numero di divisioni

Immagina una stringa di valori separata da virgola come "10,20,30, Questa è una stringa arbitraria". Questo formato è composto da tre numeri seguiti da una colonna di commento. Questa colonna di commento può contenere testo arbitrario, incluso testo con virgole al suo interno. Impedire Diviso dalla divisione del testo di questa colonna, possiamo impostare un numero massimo di colonne da dividere.

Nota: Funzionerà solo se la stringa di commento con il testo arbitrario è l'ultima colonna della tabella.

Per limitare il numero di divisioni che eseguirà il metodo split, passare il numero di campi nella stringa come secondo argomento al metodo split, in questo modo:

#! / usr / bin / env ruby
str = "10,20,30, dieci, venti e trenta"
mette str.split (/, * /, 4)
$ ./3.rb
10
20
30
Dieci, venti e trenta

Esempio di bonus!

E se volessi usare Diviso per ottenere tutti gli articoli tranne il primo?

In realtà è molto semplice:

primo, * rest = ex.split (/, /)

Conoscere i limiti

Il metodo split ha alcune limitazioni piuttosto grandi.

Prendi ad esempio la stringa '10, 20, "Bob, Eve and Mallory", 30 '. Sono previsti due numeri, seguiti da una stringa tra virgolette (che può contenere virgole) e quindi un altro numero. La divisione non può separare correttamente questa stringa in campi.

Per fare ciò, lo scanner di stringhe deve essere stateful, il che significa che può ricordare se si trova all'interno di una stringa tra virgolette o meno. Lo scanner diviso non è con stato, quindi non può risolvere problemi come questo.