Dividindo uma string é apenas uma maneira de manipular dados da string. Você também pode fazer substituições para substituir uma parte de uma sequência por outra. Por exemplo, em uma sequência de exemplo (foo, bar, baz), substituindo "foo" por "boo" in resultaria "boo, bar, baz". Você pode fazer isso e muitas outras coisas usando o sub e gsub método na classe string.
Muitas opções para substituição de Ruby
Os métodos de substituição vêm em duas variedades. o sub O método é o mais básico dos dois e vem com o menor número de surpresas. Simplesmente substitui a primeira instância do padrão designado pela substituição.
Enquanto que sub substitui apenas a primeira instância, o gsub O método substitui todas as instâncias do padrão pela substituição. Além disso, ambos sub e gsub ter sub! e gsub! homólogos. Lembre-se, métodos em Rubi esse fim em um ponto de exclamação altera a variável no lugar em vez de retornar uma cópia modificada.
Pesquisar e substituir
O uso mais básico dos métodos de substituição é substituir uma sequência de pesquisa estática por uma sequência de substituição estática. No exemplo acima, "foo" foi substituído por "boo". Isso pode ser feito para a primeira ocorrência de "foo" na string usando o
sub método ou com todas as ocorrências de "foo" usando o método gsub método.#! / usr / bin / env ruby
a = "foo, bar, baz"
b = a.sub ("foo", "boo")
coloca b
$ ./1.rb
foo, bar, baz
gsub $ ./1.rb
vaia, bar, baz
Pesquisa Flexível
A pesquisa de cadeias estáticas só pode ir tão longe. Eventualmente, você encontrará casos em que um subconjunto de cordas ou seqüências de caracteres com componentes opcionais precisarão ser correspondidas. Os métodos de substituição podem, é claro, corresponder expressões regulares em vez de seqüências estáticas. Isso permite que eles sejam muito mais flexíveis e correspondam a praticamente qualquer texto que você possa imaginar.
Este exemplo é um pouco mais do mundo real. Imagine um conjunto de valores separados por vírgula. Esses valores são inseridos em um programa de tabulação sobre o qual você não tem controle (fechado fonte). O programa que gera esses valores também é de código fechado, mas está produzindo alguns dados mal formatados. Alguns campos têm espaços após a vírgula e isso está causando a quebra do programa do tabulador.
Uma solução possível é escrever um programa Ruby para atuar como "cola" ou um filtro entre os dois programas. Este programa Ruby corrigirá qualquer problema na formatação dos dados para que o tabulador possa fazer seu trabalho. Para fazer isso, é bastante simples: substitua uma vírgula seguida por vários espaços por apenas uma vírgula.
#! / usr / bin / env ruby
STDIN.each do | l |
l.gsub! (/, + /, ",")
coloca l
fim
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
Substituições flexíveis
Agora imagine essa situação. Além da formatação menor erros, o programa que produz os dados produz dados numéricos em notação científica. O programa tabulador não entende isso, então você terá que substituí-lo. Obviamente, um simples gsub não funciona aqui porque a substituição será diferente toda vez que a substituição for concluída.
Felizmente, os métodos de substituição podem levar um bloco para os argumentos de substituição. Para cada vez que a cadeia de pesquisa é encontrada, o texto que corresponde à cadeia de pesquisa (ou regex) é passado para esse bloco. O valor gerado pelo bloco é usado como a sequência de substituição. Neste exemplo, um número de ponto flutuante na forma de notação científica (como 1.232e4) é convertido em um número normal com um ponto decimal. A sequência é convertida em um número com to_f, o número é formatado usando uma sequência de formato.
#! / usr / bin / env ruby
STDIN.each do | l |
l.gsub! (/-?\d+\.\d+e-?\d+/) do | n |
"% .3f"% n.to_f
fim
l.gsub! (/, + /, ",")
coloca l
fim
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
Não está familiarizado com expressões regulares?
Vamos dar um passo atrás e olhar para isso expressão regular. Parece enigmático e complicado, mas é muito simples. Se você não estiver familiarizado com expressões regulares, elas podem ser bastante enigmáticas. No entanto, quando você os conhece, eles são métodos simples e naturais de descrever o texto. Existem vários elementos, e vários deles possuem quantificadores.
O elemento principal aqui é o \ d classe de personagem. Isso corresponderá a qualquer dígito, os caracteres de 0 a 9. O quantificador + é usado com a classe de caracteres de dígito para indicar que um ou mais desses dígitos devem corresponder em uma linha. Você tem três grupos de dígitos, dois separados por um "."e o outro separado pela letra"e"(para expoente).
O segundo elemento flutuante é o caractere de menos, que usa o "?" quantificador. Isso significa "zero ou um" desses elementos. Portanto, em suma, pode ou não haver sinais negativos no início do número ou expoente.
Os outros dois elementos são os. caractere (período) e o e personagem. Combine tudo isso e você obtém uma expressão regular (ou conjunto de regras para correspondência de texto) que corresponde a números em forma científica (como 12.34e56).