Spec-Zone.ru › Crystal

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

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

Обычно Regex создаётся с помощью литерала регулярного выражения, использующего синтаксис PCRE. Он состоит из строки символов UTF-8, заключённой между косыми чертами (/):

/foo|bar/
/h(e+)llo/
/\d+/
/あ/

Экранирование

Регулярные выражения поддерживают те же escape-последовательности, что и строковые литералы.

/\//         # slash
/\\/         # backslash
/\b/         # backspace
/\e/         # escape
/\f/         # form feed
/\n/         # newline
/\r/         # carriage return
/\t/         # tab
/\v/         # vertical tab
/\NNN/       # octal ASCII character
/\xNN/       # hexadecimal ASCII character
/\x{FFFF}/   # hexadecimal unicode character
/\x{10FFFF}/ # hexadecimal unicode character

Символ-разделитель / необходимо экранировать внутри литералов регулярных выражений, разделённых косыми чертами. Обратите внимание: специальные символы синтаксиса PCRE необходимо экранировать, если они должны восприниматься как обычные символы.

Интерполяция

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

Модификаторы

После закрывающего разделителя может указываться несколько необязательных модификаторов, изменяющих поведение сопоставления регулярного выражения.

  • i: сопоставление без учёта регистра (PCRE_CASELESS): буквы Unicode в шаблоне соответствуют как прописным, так и строчным буквам в проверяемой строке.
  • m: многострочное сопоставление (PCRE_MULTILINE): метасимволы начала строки (^) и конца строки ($) соответствуют символам непосредственно после или непосредственно перед внутренними переводами строки в проверяемой строке соответственно, а также её самому началу и концу.
  • x: сопоставление с расширенным режимом пробелов (PCRE_EXTENDED): большинство пробельных символов в шаблоне полностью игнорируются, кроме случаев, когда они экранированы или находятся внутри символьного класса. Неэкранированные символы решётки # обозначают начало комментария, который продолжается до конца строки.
/foo/i.match("FOO")         # => #<Regex::MatchData "FOO">
/foo/m.match("bar\nfoo")    # => #<Regex::MatchData "foo">
/foo /x.match("foo")        # => #<Regex::MatchData "foo">
/foo /imx.match("bar\nFOO") # => #<Regex::MatchData "FOO">

Литералы регулярных выражений с процентным префиксом

Помимо литералов, разделённых косыми чертами, регулярные выражения также можно записывать в виде процентного литерала, обозначаемого %r и парой разделителей. Допустимы круглые скобки (), квадратные скобки [], фигурные скобки {}, угловые скобки <> и вертикальные черты ||. За исключением вертикальных черт, все разделители могут быть вложенными: начальный разделитель внутри литерала экранирует следующий закрывающий разделитель.

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

%r((/)) # => /(\/)/
%r[[/]] # => /[\/]/
%r{{/}} # => /{\/}/
%r<</>> # => /<\/>/
%r|/|   # => /\//

To the extent possible under law, the persons who contributed to this workhave waived
all copyright and related or neighboring rights to this workby associating CC0 with it.
https://crystal-lang.org/reference/1.2/syntax_and_semantics/literals/regex.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API