Как работать со строковыми методами в Ruby

Вступление

В Ruby strings имеется множество встроенных методов, облегчающих изменение и манипулирование текстом, что является обычной задачей. во многих программах.

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

Определение длины строки

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

Вот пример, который печатает длину предложения:

open_source = "Sammy contributes to open source."
print open_source.length
Output33

Помните, что каждый символ, включая буквы, цифры, пробельные символы и символы, будет учитываться, поскольку он является частью строки.

Чтобы проверить, является ли строка пустой, вы можете проверить, равна ли ее длина + 0 +, или вы можете использовать метод + empty? +:

name = ""
name.empty?    # true

name = "Sammy"
name.empty?    # false

name = "     "
name.empty?    # false

Давайте посмотрим, как мы индексируем строки и получаем доступ к содержимому строки.

Доступ к символам внутри строки

Чтобы напечатать или работать с некоторыми символами в строке, используйте метод + slice +, чтобы получить нужную вам часть.

Как arrays, где каждый элемент соответствует порядковому номеру, каждый из символов строки также соответствует номер индекса, начиная с номера индекса 0.

Для строки + Sammy + разбивка индекса выглядит следующим образом:

0 1 2 3 4

S

a

m

m

y

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

"Sammy".slice(0)     # "s"
"Sammy".slice(1,2)   # "am"
"Sammy".slice(1..4)  # "ammy"

Синтаксис + [] + является псевдонимом для + slice +, поэтому вы можете обрабатывать строки как массивы:

"Sammy"[0]     # "s"
"Sammy"[1,2]   # "am"
"Sammy"[1..4]  # "ammy"

Вы также можете получить доступ к одному символу в конце строки с отрицательным индексом. + -1 + позволит вам получить доступ к последнему символу строки, + -2 + даст доступ ко второму-последнему и так далее.

Наконец, вы можете преобразовать строку в массив символов с помощью метода + chars +:

"sammy".chars    # ["S", "a", "m", "m", "y"]

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

Далее, давайте посмотрим, как изменить регистр символов в строке.

Преобразование в верхний и нижний регистр

Методы + upcase + и + downcase + возвращают строку, в которой все буквы исходной строки преобразованы в прописные или строчные буквы. Любые символы в строке, которые не являются буквами, не будут изменены.

Давайте преобразуем строку + Sammy Shark + в верхний регистр:

name = "Sammy Shark"
print name.upcase
OuputSAMMY SHARK

Теперь давайте преобразуем строку в нижний регистр:

print name.downcase
Ouputsammy shark

Функции + upcase + и + downcase + упрощают оценку и сравнение строк, делая регистр единообразным. Например, если вы запрашиваете имя пользователя, и пользователь вводит имя пользователя с заглавной буквой, вы можете ввести ввод пользователя в нижнем регистре и сравнить его с известным значением в нижнем регистре.

Рубиновые строки также имеют метод + capitalize +, который возвращает новую строку с первым заглавным символом:

"sammy".capitalize    # "Sammy"

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

Ruby также предоставляет метод + swapcase +, который возвращает строку с измененным регистром:

text = "Sammy"
print text.swapcase
sAMMY

Методы + downcase +, + upcase +, + captalize + и + swapcase + возвращают новую строку и оставляют существующую строку без изменений. Это важно помнить, если вы делаете что-то кроме немедленной распечатки текста. Взгляните на следующий пример:

text = "sammy"
text.capitalize

print "Hello, #{text}!"
OutputHello, sammy!

Несмотря на то, что мы назвали + capitalize + для переменной + text +, мы никогда не фиксировали значение, возвращаемое + capitalize +. Нам нужно было бы переписать программу так:

text = "sammy"
text = text.capitalize

print "Hello, #{text}!"
OutputHello, Sammy!

Вы можете использовать + downcase! +, + Upcase! +, + Прописные буквы! + И + swapcase! +, Чтобы изменить исходную строку:

text = "sammy"
text = text.capitalize

print "Hello, #{text}!"

Будьте осторожны, хотя. Есть недостатки, связанные с изменением исходной строки. Ruby предоставляет оба метода, чтобы вы могли выбрать тот, который соответствует вашим потребностям.

Теперь давайте добавим и удалим пробелы из строк.

Обивка и зачистка строк

Если вы пишете программу, которая должна отформатировать некоторый текст, вы часто обнаружите, что вам нужно добавить некоторое пространство перед строкой, после или вокруг строки, чтобы она соответствовала другим данным. В других случаях вам может понадобиться удалить ненужные символы в начале или конце строк, например лишние пробелы или специальные символы.

Чтобы окружить строку пробелами, используйте метод + center +:

"Sammy",center(21)    # "        Sammy        "

Вы можете указать строку в качестве второго аргумента, если хотите использовать другой символ:

" [Sammy] ".center(21, "<>")   # "<><><> [Sammy] <><><>"

Методы + ljust + и + rjust + добавляют пробелы или символы слева или справа от строки и работают точно так же, как метод + center +:

"Sammy".ljust(20)         # "Sammy               "
"Sammy".rjust(20)         # "               Sammy"
"Sammy".rjust(20, "!")    # "!!!!!!!!!!!!!!!Sammy"

Чтобы удалить начальные пробелы из строки, используйте метод + rstrip +. Чтобы удалить завершающие пробелы, используйте + lstrip +. Используйте + strip + для удаления начальных и конечных пробелов:

"        Sammy".rstrip    # "Sammy"
"Sammy        ".lstrip    # "Sammy"
"      Sammy  ".strip     # "Sammy"

Вы можете использовать методы + center! +, + Ljust + !, + rjust! +, + Lstrip! +, + Rstrip! + И + strip! + Для изменения оригинала строка.

Иногда вам нужно удалить символы в конце строки. Метод Ruby + chop + делает именно это; удаляет последний символ из строки:

"Sammy".chop     # "Samm"

Это особенно полезно для удаления символа новой строки (+ \ n +) из строк:

"This string has a newline\n".chop

Метод + chop + оставляет исходную строку нетронутой, возвращая новую строку. Метод + chop! + Изменяет существующую строку на месте.

Метод + chomp + может удалить несколько символов из конца строки:

"Sammy".chomp("my")    # "Sam"

Если вы не указали строку для удаления, + chomp + удалит символ новой строки:

"This string has a newline\n".chomp   # "This string has a newline

Однако, если строка не содержит символа новой строки, + chomp + просто возвращает исходную строку:

"Sammy".chomp     # "Sammy"

Это делает + chomp + немного более безопасным для использования при удалении строк, чем метод + chop +, который всегда удаляет последний символ.

В Ruby есть метод + chomp! +, Который изменяет исходную строку и возвращает измененную строку, если он выполнил замену. Однако, в отличие от + chomp +, метод + chomp! + Возвращает + nil +, если не изменил строку:

string = "Hello\n"
string.chomp!     # "Hello"

string = "Hello"
string.chomp!     # nil

Далее давайте посмотрим, как искать текст в строках.

Поиск символов и текста

Иногда вам нужно определить, содержит ли строка другую строку.

Метод + include? + Проверяет, содержит ли строка другую строку. Возвращает + true, если строка существует, и` + false`, если нет:

"Sammy".include?("a")   # true
"Sammy".include?("b")   # false

Метод + index + возвращает индекс символа. Он также может идентифицировать индекс первого символа подстроки. И он возвращает + nil +, если символ или подстрока не существует:

"Sammy".index("a")     # 1
"Sammy".index("mm")    # 2
"Sammy".index("Fish")  # nil

Метод + index находит только первое вхождение. Вот пример с более длинной строкой:

text = "Sammy has a balloon"
text.index("a")    # 1

Строка «+ Сэмми имеет воздушный шар» имеет четыре вхождения буквы «а». Но + index + нашел только первое вхождение. Вам нужно будет написать что-то более конкретное, чтобы найти другое вхождение.

Например, вы можете преобразовать строку в массив символов и использовать array методы, чтобы выполнить итерацию по Результаты и выберите индексы для персонажа. Вот один из способов сделать это:

text = "Sammy has a balloon"
indices = text.chars
 .each_with_index
 .select{|char, index| char == "a" }
 .map{|pair| pair.last}

print indices
[1, 7, 10, 13]

+ each_with_index + возвращает двумерный массив, содержащий запись a для каждого символа и его индекс. + select + сводит его к только элементам, где символом является + a +, а + map + преобразует двумерный массив в одномерный массив индексов.

Помимо поиска символов в строке, вы можете проверить, начинается ли строка с символа или подстроки, используя метод + start_with? +:

text = "Sammy has a balloon"
text.start_with?("s")         # true
text.start_with?("Sammy has"  # true

Метод + start_with? + Принимает несколько строк и возвращает true, если какая-либо из них совпадает:

text = "Sammy has a balloon"
text.start_with?("Sammy the Shark", "Sammy") # true

В этом примере «Sammy the Shark» не найден, но «Sammy» есть, поэтому возвращаемое значение равно «+ true +».

Вы можете использовать метод + end_with? +, Чтобы увидеть, заканчивается ли строка заданной подстрокой. Он работает так же, как + start_with? +:

text = "Sammy has a balloon"
text.end_with?("balloon")               # true
text.end_with?("boomerang")             # false
text.end_with?("boomerang", "balloon")  # true

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

Замена текста в строках

Функция поиска и замены в текстовых процессорах позволяет искать строку и заменять ее другой строкой. Вы можете сделать это в Ruby с помощью методов + sub + и + gsub +.

Метод + sub + заменяет часть строки другой.

У Сэмми больше нет воздушного шара; это улетело Давайте изменим подстроку " has " на " had ".

balloon = "Sammy has a balloon"
print balloon.sub("has","had")

Наш вывод будет выглядеть так:

OuputSammy had a balloon.

Метод + sub заменяет только первое вхождение совпадения новым текстом. Давайте использовать измененную строку, которая имеет два вхождения слова + has +:

balloon = "Sammy has a balloon. The balloon has a ribbon"
print balloon.sub("has","had")
OutputSammy  a balloon. The balloon has a ribbon

Только первое вхождение изменилось.

Чтобы изменить их все, используйте метод + gsub +, который выполняет подстановку global:

balloon = "Sammy has a balloon. The balloon has a ribbon"
print balloon.gsub("has","had")
OutputSammy  a balloon. The balloon  a ribbon

Методы + sub + и + gsub + всегда возвращают новые строки, оставляя оригиналы без изменений. Давайте продемонстрируем это, изменив «шар» на «бумеранг» в нашей строке:

text = "Sammy has a balloon"
text.gsub("ballooon", "boomerang")
print text
OutputSammy has a balloon

Вывод не показывает результат, который мы ищем, потому что, хотя мы указали подстановку, мы никогда не присваивали результат + gsub + новой переменной. Чтобы получить желаемый результат, мы могли бы переписать программу следующим образом:

text = "Sammy has a balloon"
text = text.sub("ballooon", "boomerang")
print text

В качестве альтернативы вы можете использовать + sub! + Вместо этого, что изменяет исходную строку. Давайте попробуем это сделать пару замен строк. Мы изменим «красный шар» на «синий бумеранг»:

text = "Sammy has a red balloon"
text.sub!("red", "blue")
text.sub!("balloon", "boomerang")
print text
OutputSammy has a blue boomerang

Вы также можете использовать метод + gsub! + Для выполнения глобальной замены на месте.

Методы + sub + и + gsub + принимают regular выражения для шаблона поиска. Давайте заменим все гласные в строке символом + @ +:

"Sammy has a red balloon".gsub /[aeiou]/, "@"
"S@mmy h@s @ r@d b@ll@@n"

Значение замены не обязательно должно быть строкой. Вы можете использовать хеш, чтобы указать, как отдельные символы или части должны быть заменены. Заменим все вхождения буквы + a на` + @ + и все символы + o + `на нули:

"Sammy has a red balloon".gsub /[aeiou]/, {"a" => "@", "o" => "0"}
# "S@mmy h@s @ rd b@ll00n"

Вы можете использовать это для выполнения более сложных замен с меньшим количеством кода.

Заключение

В этом руководстве вы работали со строками и манипулировали ими, используя некоторые встроенные методы для строкового типа данных. Вы также узнали, что многие методы работы со строками имеют два варианта: один, который оставляет строку без изменений, и другой, который изменяет исходную строку. Какой вы используете, зависит от ваших потребностей. Ruby дает вам возможность выбирать, как вы хотите работать с вашими данными. Однако написание кода, который не изменяет существующие данные, может быть легче отладить позже.

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