Dzielenie ciągów znaków w Ruby za pomocą metody String#split
John Lamb//Getty Images
O ile dane wprowadzone przez użytkownika nie są pojedynczym słowem lub liczbą, to dane wejściowe muszą być rozdzielać lub zamienione w listę ciągów lub liczb.
Na przykład, jeśli program poprosi o podanie pełnego imienia i nazwiska, w tym inicjał drugiego numeru, najpierw będzie musiał podzielić to dane wejściowe na trzy oddzielne smyczki zanim będzie mógł pracować z Twoim imieniem, drugim imieniem i nazwiskiem. Osiąga się to za pomocą Ciąg#podział metoda.
Jak działa ciąg#split
W swojej najbardziej podstawowej formie Ciąg#podział przyjmuje pojedynczy argument: ogranicznik pola jako łańcuch. Ten ogranicznik zostanie usunięty z danych wyjściowych i zostanie zwrócona tablica ciągów podzielonych na ograniczniku.
Tak więc w poniższym przykładzie, zakładając, że użytkownik poprawnie wpisał swoje imię, powinieneś otrzymać trzyelementowy Szyk z podziału.
|_+_|
Jeśli uruchomimy ten program i wprowadzimy nazwę, otrzymamy oczekiwane rezultaty. Pamiętaj też, że najpierw imię oraz Wymień ostatnie są zbiegami okoliczności. The Nazwa zmienna będzie Szyk , a te dwa wywołania metod będą równoważne imię[0] oraz nazwa[-1] odpowiednio.
|_+_|Jednakże, Ciąg#podział jest trochę mądrzejszy niż myślisz. Jeśli argument za… Ciąg#podział jest ciągiem, rzeczywiście używa go jako ogranicznika, ale jeśli argument jest ciągiem z pojedynczą spacją (jak użyliśmy), to wnioskuje, że chcesz podzielić na dowolną ilość białych znaków i że chcesz również usunąć wszelkie wiodące białe znaki.
Tak więc, gdybyśmy mieli podać nieco zniekształcone dane wejściowe, takie jak
|_+_|(z dodatkowymi spacjami), to Ciąg#podział nadal będzie robić to, czego się oczekuje. Jest to jednak jedyny szczególny przypadek, gdy zdasz a Strunowy jako pierwszy argument. Ograniczniki wyrażeń regularnych
Jako pierwszy argument możesz również przekazać wyrażenie regularne. Tutaj, Ciąg#podział staje się nieco bardziej elastyczny. Możemy również sprawić, że nasz mały kod dzielenia imion będzie nieco mądrzejszy.
Nie chcemy kropki na końcu środkowego inicjału. Wiemy, że jest to inicjał środkowy, a baza danych nie będzie chciała w tym miejscu kropki, więc możemy ją usunąć podczas dzielenia. Kiedy Ciąg#podział pasuje do wyrażenia regularnego, robi dokładnie to samo, co po dopasowaniu ogranicznika ciągu: usuwa go z danych wyjściowych i dzieli w tym momencie.
Możemy więc nieco rozwinąć nasz przykład:
|_+_|Domyślny separator rekordów
Rubin nie jest zbyt duży w 'specjalnych zmiennych', które można znaleźć w językach takich jak Perl, ale Ciąg#podział używa takiego, o którym musisz wiedzieć. Jest to domyślna zmienna separatora rekordów, znana również jako $; .
Jest to coś globalnego, coś, czego często nie widzisz w Rubim, więc jeśli to zmienisz, może to wpłynąć na inne części kodu — po prostu pamiętaj, aby zmienić to z powrotem po zakończeniu.
Jednak wszystko, co robi ta zmienna, to działa jako wartość domyślna dla pierwszego argumentu do Ciąg#podział . Domyślnie ta zmienna wydaje się być ustawiona na zero . Jeśli jednak Ciąg#podział pierwszym argumentem jest zero , zastąpi go pojedynczym ciągiem spacji.
Ograniczniki o zerowej długości
Jeśli ogranicznik przeszedł do Ciąg#podział jest ciągiem znaków lub wyrażeniem regularnym o zerowej długości, wtedy Ciąg#podział zachowa się nieco inaczej. Nie usunie niczego z oryginalnego ciągu i podzieli się na każdy znak. To zasadniczo zamienia ciąg w tablicę o równej długości zawierającą tylko jednoznakowe ciągi, po jednym dla każdego znaku w ciągu.
Może to być przydatne do iteracji po łańcuchu i było używane w wersjach wcześniejszych niż 1.9.x i wcześniejszych niż 1.8.7 (które przeniesiono szereg funkcji z wersji 1.9.x) do iterowania po znakach w ciągu bez martwienia się o rozbicie wielu znaków bajt Znaki Unicode . Jeśli jednak to, co naprawdę chcesz zrobić, to iterować po łańcuchu, a używasz 1.8.7 lub 1.9.x, prawdopodobnie powinieneś użyć Ciąg#każdy_znak zamiast.
|_+_|Ograniczanie długości zwracanej tablicy
Wracając do naszego przykładu parsowania imienia, co zrobić, jeśli ktoś ma spację w swoim nazwisku? Na przykład holenderskie nazwiska mogą często zaczynać się od „van” (co oznacza „z” lub „od”).
Tak naprawdę chcemy tylko 3-elementu szyk , więc możemy użyć drugiego argumentu do Ciąg#podział które do tej pory ignorowaliśmy. Oczekuje się, że drugi argument to a Fixnum . Jeśli ten argument jest pozytywny, co najwyżej tyle elementów zostanie wypełnionych w tablicy. Więc w naszym przypadku chcielibyśmy przekazać 3 dla tego argumentu.
|_+_|Jeśli uruchomimy to ponownie i nadamy mu holenderską nazwę, będzie działać zgodnie z oczekiwaniami.
|_+_|Jeśli jednak ten argument jest ujemny (dowolna liczba ujemna), wówczas nie będzie ograniczenia liczby elementów w tablicy wyjściowej, a wszelkie końcowe ograniczniki będą wyświetlane jako ciągi o zerowej długości na końcu tablicy.
Widać to w tym fragmencie kodu IRB:
|_+_|