Учебники

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

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

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

Синтаксис

/pattern/
/pattern/im    # option can be specified
%r!/usr/local! # general delimited regular expression

пример

Live Demo

#!/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

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

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

Sr.No. Модификатор и описание
1

я

Игнорирует регистр при сопоставлении текста.

2

о

Выполняет # {} интерполяцию только один раз, при первом вычислении литерала регулярного выражения.

3

Икс

Игнорирует пробелы и допускает комментарии в регулярных выражениях.

4

м

Соответствует нескольким строкам, распознавая новые строки как нормальные символы.

5

и, е, с, п

Интерпретирует регулярное выражение как Unicode (UTF-8), EUC, SJIS или ASCII. Если ни один из этих модификаторов не указан, предполагается, что регулярное выражение использует исходную кодировку.

я

Игнорирует регистр при сопоставлении текста.

о

Выполняет # {} интерполяцию только один раз, при первом вычислении литерала регулярного выражения.

Икс

Игнорирует пробелы и допускает комментарии в регулярных выражениях.

м

Соответствует нескольким строкам, распознавая новые строки как нормальные символы.

и, е, с, п

Интерпретирует регулярное выражение как Unicode (UTF-8), EUC, SJIS или ASCII. Если ни один из этих модификаторов не указан, предполагается, что регулярное выражение использует исходную кодировку.

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

# Following matches a single slash character, no escape required
%r|/|

# Flag characters are allowed with this syntax, too
%r[</(.*)>]i

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

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

^

Соответствует началу строки.

$

Соответствует концу строки.

,

Соответствует любому отдельному символу, кроме новой строки. Использование опции m позволяет ему соответствовать новой строке.

[…]

Соответствует любому отдельному символу в скобках.

[^ …]

Соответствует любому отдельному символу не в скобках

ре *

Соответствует 0 или более вхождений предыдущего выражения.

ре +

Соответствует 1 или более вхождению предыдущего выражения.

повторно?

Соответствует 0 или 1 вхождению предыдущего выражения.

re {n}

Совпадает ровно с числом вхождений предыдущего выражения.

re {n,}

Соответствует n или более вхождений предыдущего выражения.

re {n, m}

Соответствует не менее n и не более m вхождений предшествующего выражения.

| б

Соответствует либо a, либо b.

(ре)

Группирует регулярные выражения и запоминает сопоставленный текст.

(? IMX)

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

(? -imx)

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

(?: re)

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

(? imx: re)

Временно переключает параметры i, m или x в круглых скобках.

(? -imx: re)

Временно отключает параметры i, m или x в скобках.

(? # …)

Комментарий.

(? = re)

Определяет положение с помощью шаблона. Не имеет диапазона.

(?! re)

Определяет положение, используя отрицание шаблона. Не имеет диапазона.

(?> re)

Соответствует независимому образцу без возврата.

\ ш

Соответствует символам слова.

\ W

Соответствует несловесным персонажам.

\ s

Соответствует пробелу. Эквивалентно [\ t \ n \ r \ f].

\ S

Соответствует непробельному пространству.

\ d

Соответствует цифрам. Эквивалентно [0-9].

\ D

Соответствует нецифровым значениям.

\ A

Соответствует началу строки.

\ Z

Соответствует концу строки. Если новая строка существует, она совпадает непосредственно перед новой строкой.

\ г

Соответствует концу строки.

Точки совпадений, где последний матч закончился.

\ б

Соответствует границам слов, когда они выходят за скобки. Соответствует Backspace (0x08) внутри скобок.

\ B

Соответствует несловесным границам.

\ n, \ t и т. д.

Сопоставляет переводы строк, возврат каретки, вкладки и т. Д.

\ 1 … \ 9

Соответствует n-му сгруппированному подвыражению.

\ 10

Соответствует n-му сгруппированному подвыражению, если оно уже найдено. В противном случае относится к восьмеричному представлению кода символа.

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

/Рубин/

Матчи «Рубин».

¥

Соответствует знак иены. Многобайтовые символы поддерживаются в Ruby 1.9 и Ruby 1.8.

/ [Rr] убий /

Соответствует «Рубин» или «Рубин».

/ р [вы] /

Соответствует «ruby» или «rube».

/ [AEIOU] /

Соответствует любой строчной гласной.

/ [0-9] /

Соответствует любой цифре; такой же как / [0123456789] /.

/ [AZ] /

Соответствует любой строчной букве ASCII.

/ [AZ] /

Соответствует любой прописной букве ASCII.

/ [A-Za-Z0-9] /

Соответствует любому из вышеперечисленного.

/ [^ AEIOU] /

Совпадает с чем угодно, кроме строчной гласной.

/ [^ 0-9] /

Совпадает с чем угодно, кроме цифры.

/./

Соответствует любому символу, кроме новой строки.

/./m

В многострочном режиме также соответствует символу новой строки.

/ \ д /

Соответствует цифре: / [0-9] /.

/ \ D /

Совпадает с нецифровой цифрой: / [^ 0-9] /.

/ \ s /

Соответствует пробелу: / [\ t \ r \ n \ f] /.

/ \ S /

Совпадает без пробелов: / [^ \ t \ r \ n \ f] /.

/ \ ш /

Соответствует одному слову: / [A-Za-z0-9 _] /.

/ \ W /

Соответствует несловесному символу: / [^ A-Za-z0-9 _] /.

/Рубин?/

Соответствует «rub» или «ruby»: y является необязательным.

/Рубин*/

Совпадения «руб» плюс 0 или более лет.

/ рубин + /

Совпадения «руб» плюс 1 или более лет.

/ \ д {3} /

Соответствует ровно 3 цифрам.

/ \ д {3,} /

Соответствует 3 или более цифрам.

/ \ д {3,5} /

Соответствует 3, 4 или 5 цифрам.

Это соответствует наименьшему количеству повторений —

/<.*>/

Жадное повторение: соответствует «<ruby> perl>».

/<.*?>/

Нежадный: соответствует «<ruby>» в «<ruby> perl>».

/ \ D \ D + /

Нет группы: + повторяется \ d

/ (\ D \ d) + /

Сгруппировано: + повторяет \ D \ d пару

/ ([Rr] uby (,)?) + /

Матч «Рубин», «Рубин, Рубин, Рубин» и др.

Это снова соответствует ранее подобранной группе —

/ ([Rr]) убий & \ 1ails /

Соответствует ruby ​​& rails или Ruby & Rails.

/([‘»])(?:(?!\1).)*\1/

Строка в одинарных или двойных кавычках. \ 1 соответствует любому совпадению 1-й группы. \ 2 соответствует любому совпадению 2-й группы и т. Д.

/ рубин | деревенщина /

Соответствует «ruby» или «rube».

/ р (у | ль)) /

Совпадает с «рубином» или «рублем».

/ рубин (+ |!? \) /

за «рубином» следует один или несколько! или один?

Необходимо указать позицию матча.

/ ^ Рубин /

Соответствует «Ruby» в начале строки или внутренней строки.

/ Рубиновые $ /

Соответствует «Ruby» в конце строки или строки.

/ \ ARuby /

Соответствует «Ruby» в начале строки.

/ Рубин \ Z /

Соответствует «Ruby» в конце строки.

/ \ bRuby \ б /

Совпадает с «Рубином» на границе слова.

/ \ brub \ B /

\ B не является границей слова: соответствует «rub» в «rube» и «ruby», но не в одиночку.

/ Ruby (?! =) /

Совпадает с «Ruby», если за ним следует восклицательный знак.

/Рубин(?!!)/

Совпадает с «Ruby», если после него не стоит восклицательный знак.

/ R (? # Комментарий) /

Спички «R». Все остальное — комментарий.

/ Р (? Я) убий /

Учитывает регистр при сопоставлении «uby».

/ R (I: убий) /

То же, что и выше.

/ р: |) / (у ля?)

Группировать только без создания \ 1 обратной ссылки.

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

Некоторые из наиболее важных методов String, использующие регулярные выражения, — это sub и gsub , а их варианты на месте — sub! и гсуб! ,

Все эти методы выполняют операцию поиска и замены с использованием шаблона Regexp. Sub & Sub! заменяет первое вхождение шаблона и gsub & gsub! заменяет все вхождения.

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

Ниже приведен пример —

Live Demo

#!/usr/bin/ruby

phone = "2004-959-559 #This is Phone Number"

# Delete Ruby-style comments
phone = phone.sub!(/#.*$/, "")   
puts "Phone Num : #{phone}"

# Remove anything other than digits
phone = phone.gsub!(/\D/, "")    
puts "Phone Num : #{phone}"

Это даст следующий результат —

Phone Num : 2004-959-559
Phone Num : 2004959559

Ниже приведен еще один пример —

Live Demo

#!/usr/bin/ruby

text = "rails are rails, really good Ruby on Rails"

# Change "rails" to "Rails" throughout
text.gsub!("rails", "Rails")

# Capitalize the word "Rails" throughout
text.gsub!(/\brails\b/, "Rails")
puts "#{text}"

Это даст следующий результат —