Исходный код Regex
Предоставляет регулярные выражения для Elixir.
Regex основан на PCRE (Perl Compatible Regular Expressions) и построен поверх модуля Erlang's :re. Более подробную информацию можно найти в документации модуля :re.
Регулярные выражения в Elixir можно создавать с помощью сигилов ~r (см. sigil_r/2):
# A simple regular expression that matches foo anywhere in the string ~r/foo/ # A regular expression with case insensitive and Unicode options ~r/foo/iu
Регулярные выражения, созданные с помощью сигилов, предварительно компилируются и хранятся в файле .beam. Обратите внимание, что это может быть проблемой, если вы предварительно компилируете Elixir, см. раздел «Предварительная компиляция» для получения дополнительной информации.
Регулярное выражение представлено внутри в виде структуры Regex. Поэтому %Regex{} может использоваться всякий раз, когда требуется сопоставление с ними. Имейте в виду, что все поля структур являются закрытыми. Также нет гарантии, что два регулярных выражения из одного источника будут равны, например:
~r/(?<foo>.)(?<bar>.)/ == ~r/(?<foo>.)(?<bar>.)/
может вернуть true или false в зависимости от вашей машины, порядка байтов, доступных оптимизаций и других факторов. Однако вы можете получить исходный текст скомпилированного регулярного выражения, обратившись к полю source, и затем сравнить их напрямую:
~r/(?<foo>.)(?<bar>.)/.source == ~r/(?<foo>.)(?<bar>.)/.source
Экранирование
Последовательности экранирования разделены на две категории.
Непечатаемые символы
-
\a- Сигнал тревоги, то есть символ BEL (шестнадцатеричный 07) -
\e- Экранирование (шестнадцатеричный 1B) -
\f- Форма подачи (шестнадцатеричный 0C) -
\n- Перевод строки (шестнадцатеричный 0A) -
\r- Возврат каретки (шестнадцатеричный 0D) -
\t- Табуляция (шестнадцатеричный 09) -
\xhh- Символ с шестнадцатеричным кодом hh -
\x{hhh..}- Символ с шестнадцатеричным кодом hhh..
\u и \U не поддерживаются. Другие последовательности экранирования, такие как \ddd для восьмеричных кодов, поддерживаются, но не рекомендуются.
Общие типы символов
-
\d- Любая десятичная цифра -
\D- Любой символ, который не является десятичной цифрой -
\h- Любой горизонтальный пробельный символ -
\H- Любой символ, который не является горизонтальным пробельным символом -
\s- Любой пробельный символ -
\S- Любой символ, который не является пробельным символом -
\v- Любой вертикальный пробельный символ -
\V- Любой символ, который не является вертикальным пробельным символом -
\w- Любой символ "слова" -
\W- Любой символ "не слова"
Модификаторы
Доступные модификаторы при создании Regex:
:unicode(u) - включает Unicode-специфичные шаблоны, такие как\p, и заставляет классы символов, такие как\w,\W,\s, и т. п., также соответствовать Unicode (см. примеры ниже в "Классы символов"). Ожидает, что на вход будут подаваться корректные строки Unicode:caseless(i) - добавляет регистронезависимость:dotall(s) - заставляет точку соответствовать переводам строк и также устанавливает переводы строк на любой crlf; установка перевода строки может быть переопределена путем установки(*CR)или(*LF)или(*CRLF)или(*ANY)в соответствии с документацией:re:multiline(m) - заставляет^и$отмечать начало и конец каждой строки; используйте\Aи\zдля сопоставления конца или начала строки:extended(x) - пробельные символы игнорируются, за исключением случаев экранирования или внутри[..], и позволяют#разделять комментарии:firstline(f) - принудительно заставляет неякорящийся шаблон соответствовать знаку новой строки перед или в начале нее, хотя сопоставленный текст может продолжаться за пределы новой строки:ungreedy(U) - инвертирует "жадность" regexp (предыдущий вариантrустарел в пользуU)
Недоступные опции:
-
:anchored- недоступно, используйте^или\Aвместо этого -
:dollar_endonly- недоступно, используйте\zвместо этого -
:no_auto_capture- недоступно, используйте?:вместо этого -
:newline- недоступно, используйте(*CR)или(*LF)или(*CRLF)или(*ANYCRLF)или(*ANY)в начале regexp в соответствии с документацией:re
Захваты
Многие функции в этом модуле обрабатывают то, что нужно захватить в совпадении regex, с помощью опции :capture. Поддерживаемые значения:
:all- все захваченные подшаблоны, включая полную сопоставляемую строку (это значение по умолчанию):first- только первый захваченный подшаблон, который всегда является полной сопоставляемой частью строки; все явно захваченные подшаблоны отбрасываются:all_but_first- все, кроме первого совпадающего подшаблона, т. е. все явно захваченные подшаблоны, но не полная сопоставляемая часть строки:none- не возвращает совпадающие подшаблоны вообще:all_names- захватывает все совпадения именованных подшаблонов в Regex как список, отсортированный по алфавиту по именам подшаблоновlist(binary | atom)- список именованных захватов для захвата
Классы символов
Regex поддерживает несколько встроенных именованных классов символов. Они используются путем заключения имени класса в [: :] внутри группы. Например:
iex> String.match?("123", ~r/^[[:alnum:]]+$/)
true
iex> String.match?("123 456", ~r/^[[:alnum:][:blank:]]+$/)
true
Поддерживаемые имена классов:
- alnum - Буквы и цифры
- alpha - Буквы
- blank - Только пробел или табуляция
- cntrl - Управляющие символы
- digit - Десятичные цифры (так же, как \d)
- graph - Печатаемые символы, за исключением пробела
- lower - Строчные буквы
- print - Печатаемые символы, включая пробел
- punct - Печатаемые символы, за исключением букв, цифр и пробела
- space - Пробельные символы (так же, как \s из PCRE 8.34)
- upper - Прописные буквы
- word - Символы "слова" (так же, как \w)
- xdigit - Шестнадцатеричные цифры
Существует еще один класс символов, ascii, который ошибочно соответствует символам Latin-1 вместо диапазона 0-127, указанного в POSIX. Это нельзя исправить без изменения поведения других классов, поэтому мы рекомендуем соответствовать диапазону с помощью [\\0-\x7f] вместо этого.
Обратите внимание, что поведение этих классов может меняться в зависимости от Unicode и других модификаторов:
iex> String.match?("josé", ~r/^[[:lower:]]+$/)
false
iex> String.match?("josé", ~r/^[[:lower:]]+$/u)
true
iex> Regex.replace(~r/\s/, "Unicode\u00A0spaces", "-")
"Unicode spaces"
iex> Regex.replace(~r/\s/u, "Unicode\u00A0spaces", "-")
"Unicode-spaces"
Предварительная компиляция
Регулярные выражения, созданные с помощью сигилов, предварительно компилируются и хранятся в файлах .beam. Предварительно скомпилированные regex будут проверятся во время выполнения и могут работать медленнее между операционными системами и выпусками OTP. Это редко проблема, поскольку большая часть кода Elixir, используемого во время разработки, компилируется на целевой системе (например, зависимости, архивы и escripts), а при работе в производстве код должен быть либо скомпилирован на целевой системе (через mix compile или аналогично), либо выпущен на хосте (через mix releases или аналогично) с соответствующей OTP, операционной системой и архитектурой, как на целевой системе.
Если вам известно, что вы работаете на другой системе, чем текущая, и вы выполняете несколько сопоставлений с regex, вы можете вручную вызвать Regex.recompile/1 или Regex.recompile!/1, чтобы выполнить проверку версии во время выполнения и перекомпилировать regex при необходимости.
Краткое описание
Типы
Функции
- compile(source, opts \\ "")
Компилирует регулярное выражение.
- compile!(source, options \\ "")
Компилирует регулярное выражение и поднимает исключение
Regex.CompileErrorв случае ошибок.- escape(string)
Экранирует строку для буквального сопоставления в регулярном выражении.
- match?(regex, string)
Возвращает логическое значение, указывающее, было ли совпадение или нет.
- named_captures(regex, string, options \\ [])
Возвращает заданные захватные группы в виде карты или
nilесли захватные группы не найдены.- names(regex)
Возвращает список имён в регулярном выражении.
- opts(regex)
Возвращает опции регулярного выражения.
- re_pattern(regex)
Возвращает базовое
re_patternв регулярном выражении.- recompile(regex)
Перекомпилирует существующее регулярное выражение при необходимости.
- recompile!(regex)
Перекомпилирует существующее регулярное выражение и поднимает исключение
Regex.CompileErrorв случае ошибок.- replace(regex, string, replacement, options \\ [])
Получает регулярное выражение, двоичные данные и замену, возвращает новые двоичные данные, где все совпадения заменены заменой.
- run(regex, string, options \\ [])
Выполняет регулярное выражение над заданной строкой до первого совпадения. Возвращает список со всеми захваченными группами или
nilесли совпадение не найдено.- scan(regex, string, options \\ [])
То же, что и
run/3, но возвращает все неперекрывающиеся совпадения регулярного выражения.- source(regex)
Возвращает исходный код регулярного выражения в виде двоичных данных.
- split(regex, string, options \\ [])
Разделяет заданную строку на основе заданного шаблона и заданного количества частей.
- version()
Возвращает версию базового движка регулярных выражений.
Типы
t()Source
@type t() :: %Regex{
opts: binary() | [term()],
re_pattern: term(),
re_version: term(),
source: binary()
} Функции
compile(source, opts \\ "")Source
@spec compile(binary(), binary() | [term()]) :: {:ok, t()} | {:error, term()} Компилирует регулярное выражение.
Указанные параметры могут быть двоичным кодом с символами, представляющими те же параметры регулярных выражений, что и в ~r (см. sigil_r/2) сигил, или списком параметров, как ожидается модулем Erlang's :re.
Возвращает {:ok, regex} в случае успеха, {:error, reason} в противном случае.
Примеры
iex> Regex.compile("foo")
{:ok, ~r/foo/}
iex> Regex.compile("*foo")
{:error, {~c"nothing to repeat", 0}}
iex> Regex.compile("foo", "i")
{:ok, ~r/foo/i}
iex> Regex.compile("foo", [:caseless])
{:ok, Regex.compile!("foo", [:caseless])} compile!(source, options \\ "")Source
@spec compile!(binary(), binary() | [term()]) :: t()
Компилирует регулярное выражение и вызывает Regex.CompileError в случае ошибок.
escape(string)Source
@spec escape(String.t()) :: String.t()
Экранирует строку для буквального соответствия в регулярном выражении.
Примеры
iex> Regex.escape(".")
"\\."
iex> Regex.escape("\\what if")
"\\\\what\\ if" match?(regex, string)Source
@spec match?(t(), String.t()) :: boolean()
Возвращает булево значение, указывающее на наличие или отсутствие совпадения.
Примеры
iex> Regex.match?(~r/foo/, "foo") true iex> Regex.match?(~r/foo/, "bar") false
Elixir также предоставляет текстовый оператор сопоставления =~/2 и функцию String.match?/2 в качестве альтернативы для проверки строк на соответствие регулярным выражениям и строкам.
named_captures(regex, string, options \\ [])Source
@spec named_captures(t(), String.t(), [term()]) :: map() | nil
Возвращает заданные совпадения в виде карты или nil если совпадений не найдено.
Параметры
-
:return- если установлено в:index, возвращает индекс байта и длину совпадения. По умолчанию:binary.
Примеры
iex> Regex.named_captures(~r/c(?<foo>d)/, "abcd")
%{"foo" => "d"}
iex> Regex.named_captures(~r/a(?<foo>b)c(?<bar>d)/, "abcd")
%{"bar" => "d", "foo" => "b"}
iex> Regex.named_captures(~r/a(?<foo>b)c(?<bar>d)/, "efgh")
nil names(regex)Source
@spec names(t()) :: [String.t()]
Возвращает список имен в регулярном выражении.
Примеры
iex> Regex.names(~r/(?<foo>bar)/) ["foo"]
opts(regex)Source
@spec opts(t()) :: [term()]
Возвращает параметры регулярного выражения.
См. документацию Regex.compile/2 для получения дополнительной информации.
Примеры
iex> Regex.opts(~r/foo/m)
[:multiline]
iex> Regex.opts(Regex.compile!("foo", [:caseless]))
[:caseless] re_pattern(regex)Source
@spec re_pattern(t()) :: term()
Возвращает основной re_pattern в регулярном выражении.
recompile(regex)Source
@spec recompile(t()) :: {:ok, t()} | {:error, any()} Перекомпилирует существующее регулярное выражение, если необходимо.
Это проверяет версию, хранящуюся в регулярном выражении, и перекомпилирует регулярное выражение в случае несоответствия версий.
recompile!(regex)Source
@spec recompile!(t()) :: t()
Перекомпилирует существующее регулярное выражение и вызывает Regex.CompileError в случае ошибок.
replace(regex, string, replacement, options \\ [])Source
@spec replace(t(), String.t(), String.t() | (... -> String.t()), [
{:global, boolean()}
]) :: String.t() Получает регулярное выражение, двоичный код и замену, возвращает новый двоичный код, где все совпадения заменены на замену.
Замена может быть строкой или функцией, которая возвращает строку. Результирующая строка используется в качестве замены для каждого совпадения.
Когда замена является строкой, она позволяет использовать определенные совпадения с помощью скобок в выражении регулярного выражения и обращаться к ним в замене через \N или \g{N}, где N - это номер совпадения. В случае использования \0, вставляется все совпадение. Обратите внимание, что в регулярных выражениях обратная косая черта должна быть экранирована, поэтому на практике вам нужно будет использовать \\N и \\g{N}.
Когда замена является функцией, она также позволяет использовать определенные совпадения. Функция может иметь арность N, где каждый аргумент сопоставляется с совпадением, причем первый аргумент является полным совпадением. Если функция ожидает больше аргументов, чем найдено совпадений, оставшиеся аргументы получат "".
Параметры
-
:global- когдаfalse, заменяет только первое вхождение (по умолчаниюtrue)
Примеры
iex> Regex.replace(~r/d/, "abc", "d")
"abc"
iex> Regex.replace(~r/b/, "abc", "d")
"adc"
iex> Regex.replace(~r/b/, "abc", "[\\0]")
"a[b]c"
iex> Regex.replace(~r/a(b|d)c/, "abcadc", "[\\1]")
"[b][d]"
iex> Regex.replace(~r/\.(\d)$/, "500.5", ".\\g{1}0")
"500.50"
iex> Regex.replace(~r/a(b|d)c/, "abcadc", fn _, x -> "[#{x}]" end)
"[b][d]"
iex> Regex.replace(~r/(\w+)@(\w+).(\w+)/, "abc@def.com", fn _full, _c1, _c2, c3 -> "TLD: #{c3}" end)
"TLD: com"
iex> Regex.replace(~r/a/, "abcadc", "A", global: false)
"Abcadc" run(regex, string, options \\ [])Source
@spec run(t(), binary(), [term()]) :: nil | [binary()] | [{integer(), integer()}] Запускает регулярное выражение для заданной строки до первого совпадения. Возвращает список со всеми совпадениями или nil если совпадений не произошло.
Параметры
-
:return- если установлено в:index, возвращает индекс байта и длину совпадения. По умолчанию:binary. -
:capture- что захватывать в результате. См. раздел "Совпадения", чтобы увидеть возможные значения захвата. -
:offset- (начиная с версии 1.12.0) указывает начальный смещение для сопоставления в данной строке. По умолчанию ноль.
Примеры
iex> Regex.run(~r/c(d)/, "abcd")
["cd", "d"]
iex> Regex.run(~r/e/, "abcd")
nil
iex> Regex.run(~r/c(d)/, "abcd", return: :index)
[{2, 2}, {3, 1}]
iex> Regex.run(~r/c(d)/, "abcd", capture: :first)
["cd"]
iex> Regex.run(~r/c(?<foo>d)/, "abcd", capture: ["foo", "bar"])
["d", ""] scan(regex, string, options \\ [])Source
@spec scan(t(), String.t(), [term()]) :: [[String.t()]] | [[{integer(), integer()}]] То же, что и run/3, но возвращает все неперекрывающиеся совпадения регулярного выражения.
Возвращается список списков, где каждый элемент в основном списке представляет совпадение, а каждый элемент во вторичном списке представляет захваченное содержимое.
Параметры
-
:return- если установлено в:index, возвращает индекс байта и длину совпадения. По умолчанию:binary. -
:capture- что захватывать в результате. См. раздел "Совпадения", чтобы увидеть возможные значения захвата. -
:offset- (начиная с версии 1.12.0) указывает начальный смещение для сопоставления в данной строке. По умолчанию ноль.
Примеры
iex> Regex.scan(~r/c(d|e)/, "abcd abce")
[["cd", "d"], ["ce", "e"]]
iex> Regex.scan(~r/c(?:d|e)/, "abcd abce")
[["cd"], ["ce"]]
iex> Regex.scan(~r/e/, "abcd")
[]
iex> Regex.scan(~r/ab|bc|cd/, "abcd")
[["ab"], ["cd"]]
iex> Regex.scan(~r/ab|bc|cd/, "abbccd")
[["ab"], ["bc"], ["cd"]]
iex> Regex.scan(~r/\p{Sc}/u, "$, £, and €")
[["$"], ["£"], ["€"]]
iex> Regex.scan(~r/=+/, "=ü†ƒ8===", return: :index)
[[{0, 1}], [{9, 3}]]
iex> Regex.scan(~r/c(d|e)/, "abcd abce", capture: :first)
[["cd"], ["ce"]] source(regex)Source
@spec source(t()) :: String.t()
Возвращает исходный код регулярного выражения в виде двоичного кода.
Примеры
iex> Regex.source(~r/foo/) "foo"
split(regex, string, options \\ [])Source
@spec split(t(), String.t(), [term()]) :: [String.t()]
Разделяет указанную цель по заданному шаблону и на заданное количество частей.
Параметры
:parts- при указании, разделяет строку на заданное количество частей. Если не указано,:partsпо умолчанию:infinity, что будет разделять строку на максимальное возможное количество частей, основываясь на заданном шаблоне.:trim- когдаtrue, удаляет пустые строки ("") из результата. По умолчаниюfalse.:on- определяет, на каких захватах разделять строку и в каком порядке. По умолчанию:first, что означает, что захват внутри регулярного выражения не влияет на процесс разделения. См. "Раздел «Захваты», чтобы увидеть возможные значения захватов.:include_captures- при указании, включает в результат совпадения регулярного выражения. Совпадения не учитываются при подсчете максимального количества частей, если объединены с параметром:parts. По умолчаниюfalse.
Примеры
iex> Regex.split(~r/-/, "a-b-c") ["a", "b", "c"] iex> Regex.split(~r/-/, "a-b-c", parts: 2) ["a", "b-c"] iex> Regex.split(~r/-/, "abc") ["abc"] iex> Regex.split(~r//, "abc") ["", "a", "b", "c", ""] iex> Regex.split(~r/a(?<second>b)c/, "abc") ["", ""] iex> Regex.split(~r/a(?<second>b)c/, "abc", on: [:second]) ["a", "c"] iex> Regex.split(~r/(x)/, "Elixir", include_captures: true) ["Eli", "x", "ir"] iex> Regex.split(~r/a(?<second>b)c/, "abc", on: [:second], include_captures: true) ["a", "b", "c"] iex> Regex.split(~r/-/, "-a-b--c", trim: true) ["a", "b", "c"]
version()Source
@spec version() :: term()
Возвращает версию движка регулярных выражений.
© 2012-2024 The Elixir Team
Licensed under the Apache License, Version 2.0.
https://hexdocs.pm/elixir/1.18.1/Regex.html