Jak korzystać z podstawiania ciągów w Ruby
Korzystanie z metod sub i gsub
Reza Estachrian/Stone/Getty Images
Dzielenie sznurka jest tylko jednym sposobem manipulowania danymi ciągów. Możesz również dokonać podstawień, aby zastąpić jedną część ciągu innym ciągiem. Na przykład w przykładowym łańcuchu (foo,bar,baz) zastąpienie „foo” słowem „boo” in dałoby „boo,bar,baz”. Możesz zrobić to i wiele innych rzeczy za pomocą pod oraz gsub metoda w klasie string.
Wiele opcji zastępowania rubinami
Metody substytucji występują w dwóch odmianach. The pod Metoda jest najbardziej podstawowa z dwóch i zawiera najmniej niespodzianek. Po prostu zastępuje pierwsze wystąpienie wyznaczonego wzorca zamiennikiem.
Natomiast pod zastępuje tylko pierwszą instancję, gsub Metoda zastępuje każde wystąpienie wzorca zamiennikiem. Ponadto zarówno pod oraz gsub mieć pod! oraz gsub! odpowiedniki. Pamiętaj, metody w Rubin które kończą się wykrzyknikiem, zmieniają zmienną w miejscu zamiast zwracać zmodyfikowaną kopię.
Wyszukaj i zamień
Najbardziej podstawowym zastosowaniem metod podstawienia jest zastąpienie jednego statycznego ciągu wyszukiwania jednym statycznym ciągiem zastępczym. W powyższym przykładzie „foo” zostało zastąpione przez „boo”. Można to zrobić dla pierwszego wystąpienia „foo” w ciągu za pomocą pod metody lub ze wszystkimi wystąpieniami „foo” przy użyciu gsub metoda.
#!/usr/bin/env ruby
a = 'foo,bar,baz'
b = a.sub( 'foo', 'boo' )
stawia b
$ ./1.rb
foo, bar, baz
gsub$ ./1.rb
buu, bar, baz
Elastyczne wyszukiwanie
Wyszukiwanie ciągów statycznych może zajść tylko do tej pory. W końcu natkniesz się na przypadki, w których podzbiór smyczki lub ciągi z opcjonalnymi komponentami będą musiały zostać dopasowane. Metody podstawienia mogą oczywiście dopasowywać wyrażenia regularne zamiast ciągów statycznych. Dzięki temu są znacznie bardziej elastyczne i pasują do praktycznie każdego tekstu, jaki możesz wymyślić.
Ten przykład jest trochę bardziej rzeczywisty. Wyobraź sobie zestaw wartości oddzielonych przecinkami. Te wartości są wprowadzane do programu tabelarycznego, nad którym nie masz kontroli (zamknięte źródło ). Program, który generuje te wartości, jest również zamkniętym źródłem, ale wyświetla źle sformatowane dane. Niektóre pola mają spacje po przecinku, co powoduje awarię programu tabulatora.
Jednym z możliwych rozwiązań jest napisanie programu Rubiego, który będzie działał jako „klej” lub filtr między tymi dwoma programami. Ten program Ruby naprawi wszelkie problemy w formatowaniu danych, aby tabulator mógł wykonać swoją pracę. Aby to zrobić, jest to dość proste: zastąp przecinek, po którym następuje kilka spacji, tylko przecinkiem.
#!/usr/bin/env ruby
STDIN.każdy do|l|
l.gsub!( /, +/, ',' )
stawia mnie
koniec
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
Elastyczne zamienniki
Teraz wyobraź sobie tę sytuację. Oprócz drobnego formatowania błędy , program generujący dane generuje dane liczbowe w notacji naukowej. Program tabulatora tego nie rozumie, więc będziesz musiał to zastąpić. Oczywiście prosty gsub tutaj się nie sprawdzi, ponieważ wymiana będzie inna za każdym razem, gdy zostanie wykonana wymiana.
Na szczęście metody podstawienia mogą przyjąć blok dla argumentów podstawienia. Za każdym razem, gdy wyszukiwany ciąg zostanie znaleziony, tekst pasujący do szukanego ciągu (lub wyrażenia regularnego) jest przekazywany do tego bloku. Wartość uzyskana przez blok jest używana jako łańcuch zastępczy. W tym przykładzie liczba zmiennoprzecinkowa w postaci notacji naukowej (taka jak 1.232e4 ) jest konwertowany na normalną liczbę z kropką dziesiętną. Ciąg jest konwertowany na liczbę z to_f , liczba jest formatowana przy użyciu ciągu formatującego.
#!/usr/bin/env ruby
STDIN.każdy do|l|
l.gsub!( /-?d+.d+e-?d+/) do|n|
'%.3f' % n.to_f
koniec
l.gsub!( /, +/, ',' )
stawia mnie
koniec
gsub$ cat floatdata.txt
2.215e-1, 54, 11
3.15668e6, 21, 7
gsub$ cat floatdata.txt | ./3.rb
0.222.54.11
3156680000,21,7
Nie znasz wyrażeń regularnych?
Cofnijmy się i spójrzmy na to Wyrażenie regularne . Wygląda tajemniczo i skomplikowanie, ale jest bardzo prosty. Jeśli nie znasz wyrażeń regularnych, mogą być dość tajemnicze. Jednak gdy już się z nimi zapoznasz, są to proste i naturalne metody opisywania tekstu. Istnieje wiele elementów, a kilka z nich ma kwantyfikatory.
Podstawowym elementem jest tutaj d klasa postaci. Dopasuje to dowolną cyfrę, znaki od 0 do 9. Kwantyfikator + jest używany z klasą znaków digit do oznaczenia, że jedna lub więcej z tych cyfr powinno być dopasowanych w rzędzie. Masz trzy grupy cyfr, dwie oddzielone znakiem „ . ' a druga oddzielona literą ' oraz ' (dla wykładnika).
Drugim elementem unoszącym się wokół jest znak minus, który używa znaku ' ? kwantyfikator. Oznacza to „zero lub jeden” z tych elementów. Krótko mówiąc, na początku liczby lub wykładnika mogą występować lub nie znaki ujemne.
Dwa pozostałe elementy to . (kropka) znak i oraz postać. Połącz to wszystko, a otrzymasz wyrażenie regularne (lub zestaw reguł dopasowywania tekstu), które dopasowuje liczby w formie naukowej (takiej jak 12.34e56 ).