Разделение строк в Ruby с помощью метода String # split

Если пользовательский ввод не является одним словом или числом, этот ввод необходимо будет разделить или превратить в список строк или чисел.

Например, если программа запрашивает ваше полное имя, включая инициал отчества, ей сначала необходимо разделить этот ввод на три отдельные строки, прежде чем она сможет работать с вашим индивидуальным именем, отчеством и фамилией. Это достигается с помощью метода String # split .

Как работает String # split

В самой простой форме String # split принимает единственный аргумент: разделитель поля в виде строки. Этот разделитель будет удален из вывода, и будет возвращен массив строк, разделенных разделителем.

Итак, в следующем примере, предполагая, что пользователь вводит их имя правильно, вы должны получить трехэлементный Array из разделения.

 #!/usr/bin/ env ruby ​​
print "Как ваше полное имя?"
full_name = gets.chomp
name = full_name.split ('')
вставляет "Ваше имя is # {name.first} "
ставит" Ваша фамилия # {name.last} "

Если мы запускаем эту программу и вводим имя, мы получим ожидаемые результаты. Также обратите внимание, что name.first и name.last являются совпадениями. Переменная name будет массивом , и эти два вызова метода будут эквивалентны name [0] и name [-1] соответственно.

 $ ruby ​​split.rb 
Как ваше полное имя? Майкл С. Морин
Ваше имя - Майкл
Ваша фамилия - Морин

Однако String # split немного умнее, чем вы думаете. Если аргумент для String # split является строкой, он действительно использует ее в качестве разделителя, но если аргумент является строкой с одним пробелом (как мы использовали), тогда он предполагает, что вы хотите разделить на любое количество пробелов и что вы также хотите удалить любые ведущие пробелы.

Итак, если бы мы дали ему немного искаженный ввод например

 Майкл С. Морин 

(с дополнительными пробелы), то String # split все равно будет делать то, что ожидается. Однако это единственный особый случай, когда вы передаете String в качестве первого аргумента. Разделители регулярных выражений

Вы также можете передать регулярное выражение в качестве первого аргумента. Здесь String # split становится немного более гибким. Мы также можем сделать наш небольшой код разделения имен немного умнее.

Нам не нужна точка в конце среднего инициала. Мы знаем, что это средний инициал, и базе данных не нужна точка, поэтому мы можем удалить его при разделении. Когда String # split соответствует регулярному выражению, он делает то же самое, как если бы он только что совпал с разделителем строки: он извлекает его из вывода и разбивает его в этой точке.

Итак, мы можем немного усовершенствовать наш пример:

 $ cat split.rb  
#!/usr/bin/env ruby ​​
print «Как ваше полное имя?»
full_name = gets.chomp
name = full_name.split (/ .? s +/)
помещает "Ваше имя # {name.first}"
помещает "Ваше среднее инициальное имя # {name [1]}"
помещает "Ваша фамилия # {name.last}"

Разделитель записей по умолчанию

Ruby не действительно много “специальных переменных”, которые вы можете найти в таких языках, как Perl, но String # split действительно использует ту, о которой вам нужно знать. Это переменная-разделитель записей по умолчанию, также известная как

Это глобальная переменная, чего вы не делаете. часто встречается в Ruby, поэтому, если вы измените его, это может повлиять на другие части кода – просто обязательно измените его, когда закончите.

Однако, все, что делает эта переменная, – это значение по умолчанию для первого аргумента String # split . По умолчанию для этой переменной установлено значение nil . Однако, если первый аргумент String # split равен nil , он заменит его одной строкой пробела.

Разделители нулевой длины

Если разделитель, переданный в String # split , является строкой нулевой длины или регулярным выражением, тогда Разделение строки # будет действовать немного иначе. Он ничего не удалит из исходной строки и разделит на каждый символ. По сути, это превращает строку в массив равной длины, содержащий только односимвольные строки, по одной для каждого символа в строке.

Это может быть полезно для итерации над строкой и использовался в версиях до 1.9.x и до 1.8.7 (которые поддерживали ряд функций из 1.9.x) для перебора символов в строке, не беспокоясь о разбиении многобайтовых символов Unicode. Однако, если вы действительно хотите перебирать строку и используете 1.8.7 или 1.9.x, вам, вероятно, следует вместо этого использовать String # each_char .

 #!/usr/bin/env ruby ​​
str = "Она превратила меня в тритона!"
str.split ('' ). каждый do | c |
помещает c
end

Ограничение длины возвращаемого массива

Итак, вернемся к нашему примеру синтаксического анализа имени, что, если у кого-то есть пробел в своей фамилии? Например, голландские фамилии часто могут начинаться с «van» (что означает «из» или «от»).

Нам действительно нужен только трехэлементный массив , поэтому мы можем использовать второй аргумент для String # split , который мы до сих пор игнорировали. Второй аргумент должен быть Fixnum . Если этот аргумент положительный, то самое большее количество элементов будет заполнено в массиве.. Итак, в нашем случае мы хотели бы передать 3 для этого аргумента.

 #!/Usr/bin/env ruby ​​
print "What ваше полное имя? "
full_name = gets.chomp
name = full_name.split (/.? s +/, 3)
ставит" Ваше имя # { name.first} "
ставит" Ваш средний инициал # {name [1]} "
вставляет" Ваша фамилия # {name.last} "

Если мы запустим это снова и дадим ему голландское имя, он будет действовать, как ожидалось.

 $ ruby ​​split.rb 
Как ваше полное имя? Винсент Виллем Ван Гог
Ваше имя - Винсент
Ваше среднее инициальное имя - Виллем
Ваша фамилия - Ван Гог

Однако, если этот аргумент отрицательный (любое отрицательное число), тогда не будет ограничений на количество элементов в выходном массиве, и любые конечные разделители будут отображаться как строки нулевой длины в конце массива.

Это продемонстрировано в следующем фрагменте IRB:

: 001  > "this, is, a, test ,,,,". split (',', -1) 
=> ["this", "is", "a", "test", "" , "", "", ""]

Оцените статью
recture.ru
Добавить комментарий