Jak používat řetězcovou substituci v Ruby

Rozdělení řetězce je pouze jeden způsob, jak manipulovat s řetězcovými daty. Můžete také provést substituce, abyste nahradili jednu část řetězce jiným řetězcem. Například v příkladu řetězec (foo, bar, baz) nahrazení „foo“ za „boo“ in by přineslo „boo, bar, baz.“ Můžete to udělat a mnoho dalších věcí pomocí sub a gsub metoda ve třídě řetězců.

Mnoho možností pro substituci Ruby

Substituční metody přicházejí ve dvou variantách. sub metoda je nejzákladnější z těchto dvou a přichází s nejmenším počtem překvapení. Nahrazuje jednoduše první instanci určeného vzoru.

Zatímco sub nahrazuje pouze první instanci gsub metoda nahradí každou instanci vzoru nahrazením. Kromě toho obojí sub a gsub mít sub! a gsub! protějšky. Pamatujte, metody v Rubín které končí vykřičníkem, mění proměnnou na místo namísto vracení upravené kopie.

Hledat a nahradit

Nejzákladnějším použitím substitučních metod je nahrazení jednoho statického vyhledávacího řetězce jedním statickým nahrazovacím řetězcem. Ve výše uvedeném příkladu byl výraz „foo“ nahrazen výrazem „boo“. To lze provést pro první výskyt "foo" v řetězci pomocí

instagram viewer
sub metoda nebo se všemi výskyty "foo" pomocí gsub metoda.

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

Flexibilní vyhledávání

Hledání statických řetězců může jít jen tak daleko. Nakonec narazíte na případy, kdy podmnožina řetězce nebo řetězce s volitelnými komponenty budou muset být sladěny. Substituční metody mohou samozřejmě odpovídat regulárním výrazům místo statických řetězců. To jim umožňuje být mnohem flexibilnější a vyrovnat se prakticky jakémukoli textu, který si můžete vysnít.

Tento příklad je trochu reálnější svět. Představte si sadu hodnot oddělených čárkami. Tyto hodnoty jsou vloženy do tabulkového programu, nad kterým nemáte žádnou kontrolu (zavřeno) zdroj). Program, který tyto hodnoty generuje, je také uzavřeným zdrojem, ale vydává některá špatně formátovaná data. Některá pole mají za čárkou mezery a to způsobuje poškození programu tabulator.

Jedním z možných řešení je napsat program Ruby, který bude působit jako „lepidlo“ nebo filtr mezi těmito dvěma programy. Tento program Ruby odstraní všechny problémy s formátováním dat, aby tabelátor mohl vykonávat svou práci. To je docela jednoduché: nahradit čárku následovanou řadou mezer jen čárkou.

#! / usr / bin / env ruby
STDIN.each do | l |
l.gsub! (/, + /, ",")
staví l
konec
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

Flexibilní náhrady

Teď si představte tuto situaci. Kromě drobného formátování chyby, program, který data vytváří, vytváří ve vědeckém zápisu čísla. Tabulátor program tomu nerozumí, takže jej budete muset nahradit. Je zřejmé, že jednoduchý gsub zde neudělá, protože nahrazení bude jiné pokaždé, když bude provedena výměna.

Naštěstí substituční metody mohou blokovat argumenty substituce. Pokaždé, když je vyhledávací řetězec nalezen, je text, který odpovídal vyhledávacímu řetězci (nebo regexu), předán do tohoto bloku. Hodnota poskytnutá blokem se používá jako substituční řetězec. V tomto příkladu číslo s plovoucí desetinnou čárkou ve formě vědecké notace (například 1,232e4) se převede na normální číslo s desetinnou čárkou. Řetězec se převede na číslo pomocí to_f, potom je číslo formátováno pomocí formátovacího řetězce.

#! / usr / bin / env ruby
STDIN.each do | l |
l.gsub! (/-?\d+\.\d+e-?\d+/) do | n |
"% .3f"% n.to_f
konec
l.gsub! (/, + /, ",")
staví l
konec
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

Nejste obeznámeni s regulárními výrazy?

Vraťme se o krok zpět a podívejme se na to regulární výraz. Vypadá to krypticky a komplikovaně, ale je to velmi jednoduché. Pokud neznáte regulární výrazy, mohou být docela kryptické. Jakmile je však znáte, jedná se o jednoduché a přirozené metody popisu textu. Existuje řada prvků a několik prvků má kvantifikátory.

Primárním prvkem je zde \ d znaková třída. To se bude shodovat s jakoukoli číslicí, znaky 0 až 9. Kvantifikátor + se používá s třídou číslicových znaků pro označení toho, že jedna nebo více těchto číslic by měla být přiřazena v řadě. Máte tři skupiny číslic, dvě oddělené znakem „."a další oddělené písmenem"E"(pro exponent).

Druhým prvkem, který se vznáší kolem, je znak mínus, který používá znak „?"kvantifikátor." To znamená "nula nebo jeden" z těchto prvků. Stručně řečeno, na začátku čísla nebo exponenta mohou nebo nemusí být negativní znaky.

Další dva prvky jsou. (období) charakter a E charakter. Zkombinujte to vše a získáte regulární výraz (nebo soubor pravidel pro odpovídající text), který odpovídá číslům ve vědecké podobě (například 12,34 e56).