Como usar o método "Split" no Ruby

Como você já deve saber, strings in Rubi são o que são conhecidos como objetos de primeira classe que usam vários métodos para consultas e manipulação.

Um dos mais básicos manipulação de cordas ações é dividir uma string em várias sub-strings. Isso seria feito, por exemplo, se você tiver uma string como"foo, bar, baz" e você quer as três cordas "foo", "bar" e "baz". o Dividido O método da classe String pode fazer isso por você.

O uso básico de "Split"

O uso mais básico do Dividido O método é dividir uma sequência com base em um único caractere ou sequência estática de caracteres. Se o primeiro argumento da divisão for uma sequência, os caracteres dessa sequência serão usados ​​como um delimitador separador, enquanto nos dados delimitados por vírgula, a vírgula será usada para separar os dados.

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

Adicione flexibilidade com expressões regulares

Existem maneiras mais fáceis de delimitar o corda. Usar uma expressão regular como seu delimitador torna o método de divisão muito mais flexível.

instagram viewer

Mais uma vez, considere, por exemplo, a string "foo, bar, baz". Há um espaço após a primeira vírgula, mas não após a segunda. Se a cadeia "," for usada como delimitador, ainda haverá um espaço no início da cadeia "bar". Se a cadeia "," for usada (com um espaço após a vírgula), ela corresponderá apenas à primeira vírgula, pois a segunda vírgula não terá espaço após ela. É muito limitante.

A solução para esse problema é usar uma expressão regular como argumento do delimitador em vez de uma sequência. Expressões regulares permitem combinar não apenas seqüências estáticas de caracteres, mas também números indeterminados de caracteres e caracteres opcionais.

Escrevendo expressões regulares

Ao escrever uma expressão regular para o seu delimitador, o primeiro passo é descrever em palavras o que é o delimitador. Nesse caso, a frase "uma vírgula que pode ser seguida por um ou mais espaços" é razoável.

Existem dois elementos nesse regex: a vírgula e os espaços opcionais. Os espaços usarão o quantificador * (estrela ou asterisco), que significa "zero ou mais". Qualquer elemento que precede isso corresponderá a zero ou mais vezes. Por exemplo, o regex /a*/ corresponderá a uma sequência de zero ou mais caracteres 'a'.

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

Limitando o número de divisões

Imagine uma cadeia de valor separada por vírgula, como "10,20,30, esta é uma sequência arbitrária". Este formato é de três números seguidos por uma coluna de comentários. Esta coluna de comentários pode conter texto arbitrário, incluindo texto com vírgulas. Prevenir Dividido ao dividir o texto desta coluna, podemos definir um número máximo de colunas para dividir.

Nota: Isso funcionará apenas se a sequência de comentários com o texto arbitrário for a última coluna da tabela.

Para limitar o número de divisões que o método split realizará, passe o número de campos na string como um segundo argumento para o método split, assim:

#! / usr / bin / env ruby
str = "10,20,30, dez, vinte e trinta"
coloca str.split (/, * /, 4)
$ ./3.rb
10
20
30
Dez, vinte e trinta

Exemplo de bônus!

E se você quisesse usar Dividido para obter todos os itens, exceto o primeiro?

Na verdade, é muito simples:

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

Conhecendo as limitações

O método split tem algumas limitações bastante grandes.

Tomemos, por exemplo, a string '10, 20, "Bob, Eve e Mallory", 30 '. O que se pretende são dois números, seguidos por uma string entre aspas (que pode conter vírgulas) e depois outro número. A divisão não pode separar corretamente essa sequência em campos.

Para fazer isso, o scanner de cordas deve ser com estado, o que significa que ele pode se lembrar se está dentro de uma sequência de caracteres citada ou não. O scanner dividido não é estável, portanto, não pode resolver problemas como este.

instagram story viewer