Ruby Регулярные выражения

Регулярные выражения— это специальная последовательность символов, которая сопоставляет или выполняет поиск по коллекции строк с помощью шаблона со специальным синтаксисом.

Регулярные выражения используют предопределённый набор определённых символов и комбинаций этих символов для формирования "строки правил", которая используется для выражения логики фильтрации строк.

Синтаксис

Регулярные выраженияБуквально, это шаблон между слэшами или между произвольными разделителями после %r, как показано ниже:

/pattern/ /pattern/im #Можно указать параметры %r!/usr/local! #Регулярные выражения с разделителями

Примеры

#!/usr/bin/ruby line1 = "Кошки умнее собак"; line2 = "Собаки тоже любят мясо"; if ( line1 =~ /Cats(.*)/ ) puts "Line1 содержит Cats" end if ( line2 =~ /Cats(.*)/ ) puts "Line2 содержит Dogs" end

Попробуйте »

Вывод приведенного выше примера:

Line1 contains Cats

Модификаторы регулярных выражений

Литерал регулярного выражения может содержать необязательный модификатор для управления различными аспектами сопоставления. Модификатор указывается после второго символа косой черты, как показано в примере выше. В следующей таблице перечислены возможные модификаторы:

МодификаторОписание
iИгнорировать регистр при сопоставлении текста.
oВыполнять интерполяцию #{} только один раз; регулярное выражение вычисляется при первом использовании.
xИгнорировать пробелы, позволяя размещать пробельные символы и комментарии внутри всего выражения.
mСопоставлять несколько строк, распознавая символы новой строки как обычные символы.
u,e,s,nИнтерпретировать регулярное выражение как Unicode (UTF-8), EUC, SJIS или ASCII. Если модификатор не указан, считается, что регулярное выражение использует исходную кодировку.

Так же как строки ограничиваются с помощью %Q, Ruby позволяет использовать %r в качестве начала регулярного выражения, за которым следует любой разделитель. Это очень полезно при описании шаблонов, содержащих много символов косой черты, которые вы не хотите экранировать.

#Следующее сопоставляется с одиночным символом косой черты без экранирования: %r|/| # Символы-флаги можно сопоставлять с помощью следующего синтаксиса %r[</(.*)>]i

Шаблоны регулярных выражений

За исключением управляющих символов,(+ ? . * ^ $ ( ) [ ] { } | \)все остальные символы сопоставляются сами с собой. Вы можете экранировать управляющие символы, поставив перед ними обратную косую черту.

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

ПаттернОписание
^Совпадает с началом строки.
$Совпадает с концом строки.
.Совпадает с любым одиночным символом, кроме символа новой строки. С опцией m также совпадает с символом новой строки.
[...]Совпадает с любым одиночным символом в квадратных скобках.
[^...]Совпадает с любым одиночным символом, не входящим в квадратные скобки.
re*Совпадает с предыдущим подвыражением ноль или более раз.
re+Совпадает с предыдущим подвыражением один или более раз.
re?Совпадает с предыдущим подвыражением ноль или один раз.
re{ n}Совпадает с предыдущим подвыражением ровно n раз.
re{ n,}Совпадает с предыдущим подвыражением n или более раз.
re{ n, m}Совпадает с предыдущим подвыражением не менее n раз и не более m раз.
a| bСовпадает с a или b.
(re)Группирует регулярное выражение и запоминает совпавший текст.
(?imx)Временно включает опцию i, m или x внутри регулярного выражения. Если находится внутри круглых скобок, это влияет только на часть внутри круглых скобок.
(?-imx)Временно отключает опцию i, m или x внутри регулярного выражения. Если находится внутри круглых скобок, это влияет только на часть внутри круглых скобок.
(?: re)Группирует регулярное выражение, но не запоминает совпавший текст.
(?imx: re)Временно включает опции i, m или x внутри круглых скобок.
(?-imx: re)Временно отключает опции i, m или x внутри круглых скобок.
(?#...)Комментарий.
(?= re)Задаёт позицию с помощью шаблона. Не имеет диапазона.
(?! re)Задаёт позицию с помощью шаблона с отрицанием. Не имеет диапазона.
(?> re)Сопоставляет независимый шаблон без обратного отслеживания.
\wСопоставляет словесный символ.
\WСопоставляет несловесный символ.
\sСопоставляет пробельный символ. Эквивалентно [\t\n\r\f].
\SСоответствует непробельному символу.
\dСоответствует цифре. Эквивалентно [0-9].
\DСоответствует нецифровому символу.
\AСоответствует началу строки.
\ZСоответствует концу строки. Если существует перевод строки, совпадает только перед ним.
\zСовпадает с концом строки.
\GСоответствует позиции, в которой завершилось последнее совпадение.
\bСоответствует границе слова вне квадратных скобок; внутри квадратных скобок соответствует символу возврата на одну позицию (0x08).
\BСоответствует негранице слова.
\n, \t и т. д.Соответствует переводу строки, возврату каретки, табуляции и т. д.
\1...\9Соответствует n-му сгруппированному подвыражению.
\10Если оно уже было сопоставлено, соответствует n-му сгруппированному подвыражению. В противном случае оно обозначает восьмеричное представление кодировки символа.

Примеры регулярных выражений

Символы

ПримерыОписание
/ruby/Соответствует "ruby"
¥Соответствует знаку иены. Ruby 1.9 и Ruby 1.8 поддерживают несколько символов.

Классы символов

ПримерыОписание
/[Rr]uby/ Соответствует "Ruby" или "ruby"
/rub[ye]/ Совпадает с "ruby" или "rube"
/[aeiou]/Соответствует любой строчной гласной
/[0-9]/ Соответствует любой цифре, так же как /
/[a-z]/Соответствует любой строчной букве ASCII
/[A-Z]/Соответствует любой прописной букве ASCII
/[a-zA-Z0-9]/Соответствует любому символу в квадратных скобках
/[^aeiou]/ Соответствует любому символу, который не является строчной гласной
/[^0-9]/Совпадает с любым нецифровым символом

Специальные классы символов

ПримерыОписание
/./ Совпадает с любым символом, кроме новой строки
/./m Соответствует также символу новой строки в многострочном режиме
/\d/Соответствует цифре, эквивалентно /[0-9]/
/\D/ Соответствует нецифровому символу, эквивалентно /[^0-9]/
/\s/Соответствует пробельному символу, эквивалентно /[ \t\r\n\f]/
/\S/ Соответствует непробельному символу, эквивалентно /[^ \t\r\n\f]/
/\w/ Соответствует словесному символу, эквивалентно /[A-Za-z0-9_]/
/\W/Соответствует несловесному символу, эквивалентно /[^A-Za-z0-9_]/

Повторение

ПримерыОписание
/ruby?/ Соответствует "rub" или "ruby". Символ y необязателен.
/ruby*/ Совпадает с "rub" плюс ноль или более y.
/ruby+/Совпадает с "rub" плюс одна или более y.
/\d{3}/Совпадает ровно с 3 цифрами.
/\d{3,}/Совпадает с 3 или более цифрами.
/\d{3,5}/Совпадает с 3, 4 или 5 цифрами.

Нежадное повторение

Это совпадает с наименьшим числом повторений.

ПримерыОписание
/<.*>/Жадное повторение: совпадает с "<ruby>perl>"
/<.*?>/ Нежадное повторение: совпадает с "<ruby>" в "<ruby>perl>"

Группировка с помощью круглых скобок

ПримерыОписание
/\D\d+/ Без группировки: + повторяет \d
/(\D\d)+/ С группировкой: + повторяет пару \D\d
/([Rr]uby(, )?)+/Совпадает с "Ruby", "Ruby, ruby, ruby" и т. д.

Обратные ссылки

Это снова совпадает с ранее совпавшей группой.

ПримерыОписание
/([Rr])uby&\1ails/Совпадает с ruby&rails или Ruby&Rails
/(['"])(?:(?!\1).)*\1/Строки в одинарных или двойных кавычках. \1 соответствует символам, сопоставленным первой группой, \2 — символам, сопоставленным второй группой, и так далее.

Чередование

ПримерыОписание
/ruby|rube/Совпадает с "ruby" или "rube"
/rub(y|le)/Совпадает с "ruby" или "ruble"
/ruby(!+|\?)/ "ruby", за которым следует один или несколько символов ! или один символ ?

Якорь

Это требует указания позиции совпадения.

ПримерыОписание
/^Ruby/Совпадает со строкой или строкой, начинающейся с "Ruby"
/Ruby$/ Совпадает со строкой или строкой, заканчивающейся на "Ruby"
/\ARuby/ Совпадает со строкой, начинающейся с "Ruby"
/Ruby\Z/Совпадает со строкой, заканчивающейся на "Ruby"
/\bRuby\b/Совпадает с "Ruby" на границе слова
/\brub\B/\B — это не граница слова: совпадает с "rub" в "rube" и "ruby", но не с отдельным "rub"
/Ruby(?=!)/Совпадение с "Ruby", если далее следует восклицательный знак
/Ruby(?!!)/ Совпадение с "Ruby", если далее не следует восклицательный знак

Специальный синтаксис для круглых скобок

ПримерыОписание
/R(?#comment)/ Совпадение с "R". Все остальные символы — комментарии.
/R(?i)uby/ Без учёта регистра при сопоставлении "uby".
/R(?i:uby)/ То же, что и выше.
/rub(?:y|le))/Только группа, без обратной ссылки \1

Поиск и замена

subиgsubи их переменные подстановкиsub!иgsub!являются важными строковыми методами при использовании регулярных выражений.

Все эти методы выполняют операции поиска и замены с использованием шаблонов регулярных выражений.subиsub!Заменяют первое вхождение шаблона,gsubиgsub!Заменяет все вхождения шаблона.

subиgsubВозвращают новую строку, оставляя исходную строку неизменной, тогда какsub!иgsub!изменяет строку, для которой они вызваны.

Примеры

#!/usr/bin/ruby # -*- coding: UTF-8 -*- phone = "138-3453-1111 #Это номер телефона" #Удалить комментарии Ruby phone = phone.sub!(/#.*$/, "") puts "Номер телефона : #{phone}" #Удалить символы, кроме цифр phone = phone.gsub!(/\D/, "") puts "Номер телефона: #{phone}"

Попробуйте »

Вывод приведенного выше примера:

电话号码 : 138-3453-1111 
电话号码 : 13834531111

Примеры

#!/usr/bin/ruby # -*- coding: UTF-8 -*- text = "rails is rails, Ruby on Rails is a very good Ruby framework" #Заменить все "rails" на "Rails" text.gsub!("rails", "Rails") #Сделать заглавной первую букву каждого вхождения слова "Rails" text.gsub!(/\brails\b/, "Rails") puts "#{text}"

Попробуйте »

Вывод приведенного выше примера:

Rails 是 Rails,  Ruby on Rails 非常好的 Ruby 框架
Другие расширения