Jak korzystać z metody „Split” w Ruby

Jak być może już wiesz, ciągi znaków w Rubin są tak zwane obiekty pierwszej klasy wykorzystujące szereg metod zapytań i manipulacji.

Jeden z najbardziej podstawowych manipulacja sznurkiem Akcje to podzielenie ciągu na wiele podciągów. Można to zrobić na przykład, jeśli masz ciąg podobny do„foo, bar, baz” i chcesz trzy struny „foo”, „bar” i „baz”. The rozdzielać Metoda klasy String może to dla Ciebie osiągnąć.

Podstawowe użycie „podziału”

Najbardziej podstawowe użycie rozdzielać Metoda polega na podzieleniu łańcucha 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 separator łańcucha, podczas gdy w danych rozdzielanych przecinkami przecinek służy do oddzielania danych.

#! / usr / bin / env ruby
str = "foo, bar, baz"
wstawia str.split („,”)
./1.rb
bla
bar
baz

Dodaj elastyczność dzięki wyrażeniom regularnym

Istnieją łatwiejsze sposoby rozgraniczenia strunowy. Użycie wyrażenia regularnego jako separatora sprawia, że ​​metoda podziału jest o wiele bardziej elastyczna.

instagram viewer

Ponownie weźmy na przykład ciąg „foo, bar, baz”. Po pierwszym przecinku jest spacja, ale nie po drugim. Jeśli ciąg „,” zostanie użyty jako ogranicznik, spacja nadal będzie istnieć na początku ciągu „bar”. Jeśli zostanie użyty ciąg „,” (ze spacją po przecinku), będzie pasował tylko do pierwszego przecinka, ponieważ drugi przecinek nie ma spacji po nim. To bardzo ogranicza.

Rozwiązaniem tego problemu jest użycie wyrażenia regularnego jako argumentu separatora zamiast ciągu. Wyrażenia regularne umożliwiają dopasowanie nie tylko statycznych sekwencji znaków, ale także nieokreślonej liczby znaków i znaków opcjonalnych.

Pisanie wyrażeń regularnych

Pisząc wyrażenie regularne dla ogranicznika, pierwszym krokiem jest opisanie słowami, czym jest ogranicznik. W takim przypadku wyrażenie „przecinek, po którym może nastąpić jedno lub więcej spacji” jest uzasadnione.

Wyrażenie regularne składa się z dwóch elementów: przecinek i opcjonalne spacje. Spacje będą używać kwantyfikatora * (gwiazdka lub gwiazdka), co oznacza „zero lub więcej”. Każdy element, który go poprzedzi, będzie pasował do zera lub więcej razy. Na przykład wyrażenie regularne /a*/ dopasuje sekwencję zero lub więcej znaków „a”.

#! / usr / bin / env ruby
str = "foo, bar, baz"
wstawia str.split (/, * /)
$ ./2.rb
bla
bar
baz

Ograniczanie liczby podziałó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ć dzieląc tekst tej kolumny, możemy ustawić maksymalną liczbę kolumn do podziału.

Uwaga: Działa to tylko wtedy, gdy ciąg komentarza z dowolnym tekstem jest ostatnią kolumną tabeli.

Aby ograniczyć liczbę podziałów, które wykona metoda podziału, przekaż liczbę pól w ciągu jako drugi argument do metody podziału, jak poniżej:

#! / usr / bin / env ruby
str = "10,20,30, Dziesięć, dwadzieścia i trzydzieści"
puts 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?

To jest naprawdę bardzo proste:

po pierwsze, * rest = ex.split (/, /)

Znając ograniczenia

Metoda podziału ma pewne dość duże ograniczenia.

Weźmy na przykład ciąg „10, 20,„ Bob, Eve and Mallory ”, 30”. Zamierzane są dwie liczby, po których następuje ciąg w cudzysłowie (który może zawierać przecinki), a następnie inna liczba. Podział nie może poprawnie podzielić tego ciągu na pola.

W tym celu musi być skaner ciągów stanowy, co oznacza, że ​​pamięta, czy znajduje się w cytowanym ciągu, czy nie. Skaner podzielony nie jest stanowy, więc nie może rozwiązać problemów takich jak ten.

instagram story viewer