English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Ruby базовый учебник

Ruby продвинутый учебник

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

Регулярное выражениеЭто особая последовательность символов, которая использует шаблоны с особыми грамматическими правилами для совпадения или поиска集合 строк.

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

Грамматика

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

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

Онлайн пример

#!/usr/bin/ruby
 
line1 = "Cats are smarter than dogs";
line2 = "Dogs also like meat";
 
if ( line1 =~ /Cats(.*)/ )
  puts "Line1 contains Cats"
end
if ( line2 =~ /Cats(.*)/ )
  puts "Line2 contains    Dogs"
end

Результат выполнения примера выше:

Line1 contains Cats

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

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

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

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

# Ниже совпадает с одним символом обратной косой черты, не экранируя.
%r|/|               
 
# Flag символ может быть настроен с помощью следующей грамматики для совпадения
%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Совпадение с graphic символом.
\WСовпадение с негraphic символом.
\sСовпадение с пробельным символом. Эквивалентно [\t\n\r\f].
\SСовпадение с ненулевым символом.
\dСовпадение с числовым символом. Эквивалентно [0-9].
\DСовпадение с ненумеральным символом.
\AСовпадение с началом строки.
\ZСовпадение с концом строки. Если есть перевод строки, то совпадение только до перевода строки.
\zСовпадение с концом строки.
\GСовпадение с последним совпавшим точкой.
\bПри совпадении вне скоб совпадение с границей слова, при совпадении внутри скоб совпадение с обратным символом (0x08).
\BСовпадение с неграничным символом.
\n, \t, etc.Совпадение с переводом строки, карридж-ретуэр, табуляцией и т.д.
\1...\9Совпадение с n-ым подвыражением группы.
\10Если уже было совпадение, то совпадение с n-ым подвыражением группы. В противном случае указывает на восьмичастотное представление кода символа.

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

Символ

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

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

ПримерОписание
/[Rr]uby/Соответствие "Ruby" или "ruby"
/rub[ye]/Соответствует "ruby" или "rube".
/[aeiou]/Соответствие любой малой гласной букве
/[0-9]/Соответствие любому числу, эквивалентно /[0123456789]/
/[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"加上0 или более y.
/ruby+/Соответствие "rub"加上1 или более y.
/\d{3}/Точное соответствие 3 чисел.
/\d{3,}/Соответствие 3 или более чисел.
/\d{3,5}/Соответствие 3, 4 или 5 чисел.

Ненасыщенное повторение

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

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

Группировка через круглые скобки

ПримерОписание
/\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 - это не граница слова: соответствует "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 является отличной Ruby-фреймворком для Ruby on Rails"
 
# Заменить все "rails" на "Rails"
text.gsub!("rails", "Rails")
 
# Заменить все слова "Rails" на заглавные
text.gsub!(/\brails\b/, "Rails")
 
puts "#{text}"

Результат выполнения примера выше:

Rails — это отличная Ruby-фреймворк для Ruby on Rails