Korzystanie z metody „podziału”
Zdjęcie AMV/Digital Vision/Getty Images
Jak być może już wiesz, struny w Rubin są znane jako obiekty pierwszej klasy które używają wielu metod do zapytań i manipulacji.
Jeden z najbardziej podstawowych manipulacja ciągami Akcja polega na podzieleniu ciągu na wiele podciągów. Byłoby to zrobione, na przykład, jeśli masz ciąg taki jak „foo, bar, baz” i chcesz trzy struny „foo”, „bar” i „baz” . The rozdzielać Metoda klasy String może to zrobić za Ciebie.
Podstawowe użycie słowa „Split”
Najbardziej podstawowe zastosowanie rozdzielać Metoda polega na podzieleniu ciągu na podstawie pojedynczego znaku lub statycznej sekwencji znaków. Jeśli pierwszym argumentem split jest ciąg znaków, znaki w tym ciągu są używane jako separatory oddzielające ciągi, podczas gdy w danych rozdzielanych przecinkami przecinek służy do oddzielania danych.
#!/usr/bin/env ruby
str = 'foo,bar,baz'
umieszcza str.split(',')
$ ./1.rb
bla
bar
podstawa
Dodaj elastyczność za pomocą wyrażeń regularnych
Są prostsze sposoby na rozgraniczenie strunowy . Używanie wyrażenia regularnego jako ogranicznika sprawia, że metoda podziału jest znacznie bardziej elastyczna.
Ponownie weźmy na przykład ciąg „foo, bar, baz” . Po pierwszym przecinku jest spacja, ale nie po drugim. Jeśli ciąg „,” jest używany jako ogranicznik, spacja nadal będzie istnieć na początku ciągu „bar”. Jeśli zostanie użyty łańcuch ', ' (ze spacją po przecinku), dopasuje tylko pierwszy przecinek, ponieważ po drugim przecinku nie ma spacji. To bardzo ograniczające.
Rozwiązaniem tego problemu jest użycie wyrażenia regularnego jako argumentu ogranicznika zamiast ciągu. Wyrażenia regularne pozwalają dopasować nie tylko statyczne sekwencje znaków, ale także nieokreśloną liczbę znaków i znaki opcjonalne.
Pisanie wyrażeń regularnych
Podczas pisania wyrażenia regularnego dla ogranicznika pierwszym krokiem jest opisanie słowami, czym jest ogranicznik. W takim przypadku sensowne jest wyrażenie „przecinek, po którym może występować jedna lub więcej spacji”.
To wyrażenie regularne składa się z dwóch elementów: przecinka i spacji opcjonalnych. Spacje będą używać kwantyfikatora * (gwiazda lub gwiazdka), co oznacza „zero lub więcej”. Każdy poprzedzający to element będzie pasował zero lub więcej razy. Na przykład wyrażenie regularne /a*/ dopasuje sekwencję składającą się z zera lub więcej znaków „a”.
#!/usr/bin/env ruby
str = 'foo,bar,baz'
umieszcza str.split( /, */ )
$ ./2.rb
bla
bar
podstawa
Ograniczanie liczby splitów
Wyobraź sobie ciąg wartości oddzielony przecinkami, taki jak „10,20,30, to jest dowolny ciąg” . Ten format to trzy liczby, po których następuje kolumna komentarza. Ta kolumna komentarza może zawierać dowolny tekst, w tym tekst z przecinkami. Aby zapobiec rozdzielać od dzielenia tekstu tej kolumny możemy ustawić maksymalną liczbę kolumn do podziału.
Notatka: Działa to tylko wtedy, gdy ciąg komentarza z dowolnym tekstem jest ostatnią kolumną tabeli.
Aby ograniczyć liczbę podziałów wykonywanych przez metodę split, przekaż liczbę pól w ciągu jako drugi argument do metody split, w następujący sposób:
#!/usr/bin/env ruby
str = '10,20,30,dziesięć, dwadzieścia i trzydzieści'
umieszcza str.split( /, */, 4 )
$ ./3.rb
10
20
30
Dziesięć, dwadzieścia i trzydzieści
Przykład bonusu!
Co jeśli chcesz użyć rozdzielać zdobyć wszystkie przedmioty oprócz pierwszego?
W rzeczywistości jest to bardzo proste:
pierwszy,*reszta = ex.split(/,/)
Znajomość ograniczeń
Metoda podziału ma pewne dość duże ograniczenia.
Weźmy na przykład ciąg '10,20,'Bob, Ewa i Mallory',30' . W zamierzeniu są to dwie liczby, po których następuje ciąg w cudzysłowie (który może zawierać przecinki), a następnie kolejna liczba. Podział nie może poprawnie rozdzielić tego ciągu na pola.
W tym celu skaner strun musi być stanowy , co oznacza, że może zapamiętać, czy jest wewnątrz cytowanego ciągu, czy nie. Podzielony skaner nie jest stanowy, więc nie może rozwiązać problemów takich jak ten.