Використання Regexp у Ruby

3 хв. читання

Клас 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. Тож їх не було детально розглянуто у статті.

Посилання до офіційної документації для кожного з представлених методів:

Помітили помилку? Повідомте автору, для цього достатньо виділити текст з помилкою та натиснути Ctrl+Enter
Codeguida 5.6K
Приєднався: 8 місяців тому
Коментарі (0)

    Ще немає коментарів

Щоб залишити коментар необхідно авторизуватися.

Вхід / Реєстрація