Как разбить строки в Ruby

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

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

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

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

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

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

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

instagram viewer
имя и name.last это совпадения. имя переменная будет массиви эти два вызова метода будут эквивалентны Имя [0] и имя [-1] соответственно.

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

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

Итак, если бы мы дали ему немного искаженную информацию, такую ​​как

Майкл С. Morin

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

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

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

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

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

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

Рубин не очень хорошо разбирается в «специальных переменных», которые вы можете найти в таких языках, как Perl, но Строка # раскол использует тот, который вам нужно знать. Это переменная разделителя записей по умолчанию, также известная как $;.

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

Однако все, что делает эта переменная, действует как значение по умолчанию для первого аргумента Строка # раскол. По умолчанию эта переменная, кажется, установлена ​​в ноль. Однако если Строка # расколпервый аргумент ноль, он заменит его одной строкой пробела.

Ограничители нулевой длины

Если разделитель перешел к Строка # раскол это строка нулевой длины или регулярное выражение, то Строка # раскол будет действовать немного по-другому. Это ничего не удалит из исходной строки и разделит на каждого персонажа. Это по существу превращает строку в массив равной длины, содержащий только односимвольные строки, по одной на каждый символ в строке.

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

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

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

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

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

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

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

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

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

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

: 001> «это, есть, тест» .split (',', -1)
=> ["this", "is", "a", "test", "", "", "", ""]]
instagram story viewer