Клас Regexp
У Ruby, логіка регулярних виразів інкапсульована у класі Regexp
.
Існує три способи використання Regexp
:
Regexp.new(/.*/).class # => Regexp
/.*/.class # => Regexp
%r{.*}.class # => Regexp
Тож питання лише у тому, як опрацьовувати String
засобами Regexp
.
Клас MatchData
Клас Regexp
містить метод Regexp#match
, який приймає рядок String
як параметр і порівнює його з регулярним виразом:
/I love Ruby/.match('I love Ruby') # => #< Знайдено входження "I love Ruby">
Метод Regexp#match
повертає об'єкт типу MatchData
.
Клас MatchData
інкапсулює всі результати, які збіглися з еталонним рядком.
Перегляньте офіційну документацію, це допоможе вам детальніше ознайомитись з усіма можливостями об'єкту MatchData
.
Наприклад, метод MatchData#to_a
може бути використаним для організації ітерації по результатах.
Магічні змінні у Ruby
Ruby пропонує декілька «магічних змінних», вони автоматично створюються з результатів будь-якого нового екземпляра MatchData
.
/(I love) (Ruby)/.match("Yes, I love Ruby. We're cool.")
# $~ повертає останню версію екземпляра MatchData
$~ # => #<MatchData "I love Ruby" 1:"I love" 2:"Ruby">
$& # => "I love Ruby" (Частина рядка, що збігається)
$` # => "Yes, " (Еквівалент методу MatchData#pre_match)
$' # => ". We're cool." (Еквівалент методу MatchData#post_match)
$1 # => "I love"
$2 # => "Ruby"
$3 # => nil
Оператор порівняння з шаблоном =~
Для полегшення роботи з регулярними виразами Ruby пропонує використання синтаксичного цукру =~
. Він порівнює Regexp
з заданим рядком.
# The =~ оператор повертає індекс першої букви, першого входження, що збігається
/(devscoop)/ =~ "http://ruby.devscoop.fr" # => 12
"http://ruby.devscoop.fr" =~ /(devscoop)/ # => 12
# Оператор поверне nil якщо збіжностей не буде знайдено
/lol/ =~ "It's not funny" # => nil
Зауважте, що всі магічні змінні задаються через те, що оператор =~
створює екземпляр MatchData
у випадку виявлення збіжності Regexp
і рядку, що передається.
Іменовані входження
Іменовані входження, при використанні з оператором =~
, мають потужний механізм, який автоматично присвоює результат групи, що збігається, змінній, яка використовує ім'я, присвоєне групі у екземплярі Regexp
.
if /(?<newsletter>devscoop)/ =~ 'https://web.archive.org/web/20230208035255/http://ruby.devscoop.fr'
p newsletter # => "devscoop"
end
Іменовані входження доступні з методу Regexp#match
. Головна відмінність – відсутність необхідності створення змінної. Взагалі, іменовані входження доступні у методі MatchData#[]
екземплярі класу MatchData
, що повертається.
if projects = /(?<newsletter>devscoop)/.match('https://web.archive.org/web/20230208035255/http://ruby.devscoop.fr')
p projects['newsletter'] # => "devscoop"
end
Деталі
Наступні методи не включені у ядро Ruby і не імплементовані у regexp
. Тож їх не було детально розглянуто у статті.
Посилання до офіційної документації для кожного з представлених методів:
Ще немає коментарів