Разделение строк в Ruby с помощью метода String#split
Майкл Морин — программист, специализирующийся на Linux и Ruby. Он имеет 30-летний опыт изучения, преподавания и использования языка программирования.
Если пользовательский ввод не является одним словом или числом, этот ввод необходимо разделить или преобразовать в список строк или чисел.
Например, если программа запрашивает ваше полное имя, включая отчество, ей сначала нужно будет разделить этот ввод на три отдельные строки, прежде чем она сможет работать с вашими индивидуальными именем, отчеством и фамилией. Это достигается с помощью Строка # разделить метод.
Как работает String#split
В своей самой основной форме, Строка # разделить принимает единственный аргумент: разделитель полей в виде строки. Этот разделитель будет удален из вывода, и будет возвращен массив строк, разделенных разделителем.
Итак, в следующем примере, при условии, что пользователь правильно ввел свое имя, вы должны получить трехэлементный Множество от раскола.
Если мы запустим эту программу и введем имя, мы получим некоторые ожидаемые результаты. Также обратите внимание, что имя а также имя.фамилия являются совпадениями. имя переменная будет Множество, и эти два вызова метода будут эквивалентны имя[0] а также имя[-1] соответственно.
Однако, Строка # разделить немного умнее, чем вы думаете. Если аргумент для Строка # разделить является строкой, она действительно использует ее в качестве разделителя, но если аргумент представляет собой строку с одним пробелом (как мы использовали), то он делает вывод, что вы хотите разделить на любое количество пробелов и что вы также хотите удалить любой ведущий пробел.
Итак, если бы мы дали ему несколько искаженных входных данных, таких как
(с дополнительными пробелами), то Строка # разделить все равно будет делать то, что ожидается. Однако это единственный особый случай, когда вы передаете Нить в качестве первого аргумента. Разделители регулярных выражений
Вы также можете передать регулярное выражение в качестве первого аргумента. Здесь, Строка # разделить становится немного более гибким. Мы также можем сделать наш небольшой код разделения имени немного умнее.
Нам не нужна точка в конце среднего инициала. Мы знаем, что это средний инициал, и базе данных не нужна точка, поэтому мы можем удалить ее при разделении. Когда Строка # разделить соответствует регулярному выражению, он делает то же самое, как если бы он только что совпал с разделителем строки: он берет его из вывода и разделяет в этой точке.
Итак, мы можем немного развить наш пример:
Разделитель записей по умолчанию
В Ruby не очень много «специальных переменных», которые вы можете найти в таких языках, как Perl, но Строка # разделить использует тот, о котором вам нужно знать. Это переменная разделителя записей по умолчанию, также известная как $;.
Это глобальная переменная, которую нечасто встретишь в Ruby, поэтому, если вы ее измените, это может повлиять на другие части кода — просто не забудьте вернуть ее обратно, когда закончите.
Однако все, что делает эта переменная, — действует как значение по умолчанию для первого аргумента Строка # разделить. По умолчанию для этой переменной установлено значение ноль. Однако, если Строка # разделитьпервый аргумент ноль, он заменит его строкой с одним пробелом.
Разделители нулевой длины
Если разделитель перешел к Строка # разделить является строкой нулевой длины или регулярным выражением, то Строка # разделить будет действовать несколько иначе. Он вообще ничего не удалит из исходной строки и разделит на каждый символ. По сути, это превращает строку в массив равной длины, содержащий только односимвольные строки, по одной на каждый символ в строке.
Это может быть полезно для перебора строки и использовалось в версиях до 1.9.x и до 1.8.7 (в которых был перенесен ряд функций из версии 1.9.x) для перебора символов в строке, не беспокоясь о разбиении мульти- байтовые символы Юникода. Однако, если вы действительно хотите выполнить итерацию по строке, и вы используете 1.8.7 или 1.9.x, вам, вероятно, следует использовать Строка#each_char вместо.
Ограничение длины возвращаемого массива
Итак, вернемся к нашему примеру с разбором имени. Что, если в фамилии кого-то есть пробел? Например, голландские фамилии часто могут начинаться с «ван» (что означает «от» или «от»).
Нам действительно нужен только массив из 3 элементов, поэтому мы можем использовать второй аргумент для Строка # разделить которые мы до сих пор игнорировали. Ожидается, что вторым аргументом будет Фикснум. Если этот аргумент положителен, самое большее, что много элементов будет заполнено в массиве. Так что в нашем случае мы хотели бы передать 3 для этого аргумента.
Если мы запустим это снова и дадим ему голландское имя, оно будет работать, как и ожидалось.
Однако, если этот аргумент отрицательный (любое отрицательное число), то не будет ограничений на количество элементов в выходном массиве, и любые завершающие разделители будут отображаться в виде строк нулевой длины в конце массива.