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.
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.