Regex
Предоставляет регулярные выражения для Elixir.
Regex основан на PCRE (Perl Compatible Regular Expressions) и построен поверх модуля Erlang’s :re. Более подробную информацию можно найти в документации модуля :re.
Регулярные выражения в Elixir можно создавать, используя сигилы ~r или ~R:
# A simple regular expressions 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. Поэтому, %Regex{} можно использовать всякий раз, когда нужно сопоставлять их. Имейте в виду, что не гарантируется, что два регулярных выражения из одного и того же источника равны, например:
~r/(?<foo>.)(?<bar>.)/ == ~r/(?<foo>.)(?<bar>.)/
может вернуть true или false в зависимости от вашей машины, порядка байтов, доступных оптимизаций и других факторов. Однако вы можете получить исходный текст скомпилированного регулярного выражения, обратившись к полю source, и затем сравнить их напрямую:
~r/(?<foo>.)(?<bar>.)/.source == ~r/(?<foo>.)(?<bar>.)/.source
Предварительная компиляция
Регулярные выражения, созданные с помощью сигилов, предварительно компилируются и сохраняются в файлах .beam. Это может быть проблемой, если вы предварительно компилируете Elixir для работы в разных выпусках OTP, так как релизы OTP могут обновлять подлежащий движок регулярных выражений в любое время.
По этим причинам мы всегда рекомендуем предварительно компилировать проекты Elixir, используя версию OTP, предназначенную для работы в производстве. В случае, если кросс-компиляция действительно необходима, вы можете вручную вызвать Regex.recompile/1 или Regex.
recompile!/1 для выполнения проверки версии во время выполнения и повторной компиляции регулярного выражения при необходимости.
Модификаторы
Доступные модификаторы при создании 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) - инвертирует «жадность» регулярного выражения (предыдущий параметрrустарел в пользуU)
Недоступные параметры:
-
anchored- недоступен, используйте^или\Aвместо этого -
dollar_endonly- недоступен, используйте\zвместо этого -
no_auto_capture- недоступен, используйте?:вместо этого -
newline- недоступен, используйте(*CR)или(*LF)или(*CRLF)или(*ANYCRLF)или(*ANY)в начале регулярного выражения в соответствии с документацией re
Захват
Многие функции в этом модуле обрабатывают, что захватывать в совпадении регулярного выражения, через параметр :capture. Поддерживаемые значения:
-
:all- все захваченные подмаски, включая полную сопоставляемую строку (по умолчанию) -
:first- только первая захваченная подмаска, которая всегда является полным сопоставляемым участком строки; все явно захваченные подмаски отбрасываются -
:all_but_first- все, кроме первой сопоставляемой подмаски, то есть все явно захваченные подмаски, но не полный сопоставляемый участок строки -
:none- не возвращает сопоставляемые подмаски вообще -
:all_names- захватывает все именованные в Regex -
list(binary)- список именованных захватов для захвата
Краткое описание
Типы
- t()
Функции
- compile(source, options \\ "")
-
Компилирует регулярное выражение
- compile!(source, options \\ "")
-
Компилирует регулярное выражение и вызывает исключение
Regex.CompileErrorв случае ошибок - escape(string)
-
Экранирует строку для буквального соответствия в регулярном выражении
- match?(regex, string)
-
Возвращает логическое значение, указывающее, было ли соответствие или нет
- named_captures(regex, string, options \\ [])
-
Возвращает заданные захваты в виде карты или
nil, если совпадений не найдено. Параметр:returnможет быть установлен в:index, чтобы получить индексы обратно - names(regex)
-
Возвращает список имен в регулярном выражении
- opts(regex)
-
Возвращает параметры регулярного выражения в виде строки
- re_pattern(regex)
-
Возвращает подлежащий
re_patternв регулярном выражении - recompile(regex)
-
Перекомпилирует существующее регулярное выражение при необходимости
- recompile!(regex)
-
Перекомпилирует существующее регулярное выражение и вызывает исключение
Regex.CompileErrorв случае ошибок - regex?(term)
-
Возвращает
true, если данноеtermявляется регулярным выражением. В противном случае возвращаетfalse - replace(regex, string, replacement, options \\ [])
-
Принимает регулярное выражение, бинарное значение и замену, возвращает новую бинарную строку, где все совпадения заменены заменой
- run(regex, string, options \\ [])
-
Выполняет регулярное выражение относительно заданной строки до первого совпадения. Возвращает список со всеми захватами или
nil, если совпадение не произошло - scan(regex, string, options \\ [])
-
То же, что и
run/3, но сканирует целевой объект несколько раз, собирая все совпадения регулярного выражения - source(regex)
-
Возвращает исходный текст регулярного выражения как бинарную строку
- split(regex, string, options \\ [])
-
Разделяет заданный целевой объект на основе заданного шаблона и в заданном количестве частей
- version()
-
Возвращает версию подлежащего движка регулярных выражений
Типы
t()
t() :: %Regex{opts: binary(), re_pattern: term(), re_version: term(), source: binary()} Функции
compile(source, options \\ "")
compile(binary(), binary() | [term()]) :: {:ok, t()} | {:error, any()} Компилирует регулярное выражение.
Указанные параметры могут быть либо двоичной строкой с символами, представляющими те же параметры регулярного выражения, которые передаются сигилу ~r, или списком параметров, как ожидается от модуля Erlang’s :re.
Возвращает {:ok, regex} в случае успеха, {:error, reason} в противном случае.
Примеры
iex> Regex.compile("foo")
{:ok, ~r"foo"}
iex> Regex.compile("*foo")
{:error, {'nothing to repeat', 0}} compile!(source, options \\ "")
compile!(binary(), binary() | [term()]) :: t()
Компилирует регулярное выражение и вызывает исключение Regex.CompileError в случае ошибок.
escape(string)
escape(String.t()) :: String.t()
Экранирует строку для буквального соответствия в регулярном выражении.
Примеры
iex> Regex.escape(".")
"\\."
iex> Regex.escape("\\what if")
"\\\\what\\ if" match?(regex, string)
match?(t(), String.t()) :: boolean()
Возвращает логическое значение, указывающее, было ли соответствие или нет.
Примеры
iex> Regex.match?(~r/foo/, "foo") true iex> Regex.match?(~r/foo/, "bar") false
named_captures(regex, string, options \\ [])
named_captures(t(), String.t(), [term()]) :: map() | nil
Возвращает заданные захваты в виде карты или nil , если совпадений не найдено. Параметр :return может быть установлен в :index , чтобы получить индексы обратно.
Примеры
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)
names(t()) :: [String.t()]
Возвращает список имен в регулярном выражении.
Примеры
iex> Regex.names(~r/(?<foo>bar)/) ["foo"]
opts(regex)
opts(t()) :: String.t()
Возвращает параметры регулярного выражения в виде строки.
Примеры
iex> Regex.opts(~r(foo)m) "m"
re_pattern(regex)
re_pattern(t()) :: term()
Возвращает подлежащий re_pattern в регулярном выражении.
recompile(regex)
recompile(t()) :: t()
Перекомпилирует существующее регулярное выражение при необходимости.
Проверяет версию, сохраненную в регулярном выражении, и перекомпилирует выражение в случае несоответствия версий.
recompile!(regex)
recompile!(t()) :: t()
Перекомпилирует существующее регулярное выражение и поднимает Regex.CompileError в случае ошибок.
regex?(term)
regex?(any()) :: boolean()
Возвращает true если заданный term является регулярным выражением. В противном случае возвращает false.
Примеры
iex> Regex.regex?(~r/foo/) true iex> Regex.regex?(0) false
replace(regex, string, replacement, options \\ [])
replace(t(), String.t(), String.t() | (... -> String.t()), [term()]) :: 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/a/, "abcadc", "A", global: false)
"Abcadc" run(regex, string, options \\ [])
run(t(), binary(), [term()]) ::
nil |
[binary()] |
[{integer(), integer()}] Выполняет регулярное выражение на заданной строке до первого совпадения. Возвращает список со всеми группами или nil если совпадение не найдено.
Параметры
-
:return- устанавливает в:indexдля возвращения индексов. По умолчанию:binary. -
:capture- что захватить в результате. Обратитесь к moduledoc дляRegex, чтобы увидеть возможные значения групп.
Примеры
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}] scan(regex, string, options \\ [])
scan(t(), String.t(), [term()]) :: [[String.t()]]
То же, что и run/3, но сканирует целевой объект несколько раз, собирая все совпадения регулярного выражения.
Возвращается список списков, где каждый элемент в главном списке представляет совпадение, а каждый элемент во внутреннем списке - захваченные значения.
Параметры
-
:return- устанавливает в:indexдля возвращения индексов. По умолчанию:binary. -
:capture- что захватить в результате. Обратитесь к moduledoc дляRegex, чтобы увидеть возможные значения групп.
Примеры
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/\p{Sc}/u, "$, £, and €")
[["$"], ["£"], ["€"]] source(regex)
source(t()) :: String.t()
Возвращает исходный текст регулярного выражения как бинарный объект.
Примеры
iex> Regex.source(~r(foo)) "foo"
split(regex, string, options \\ [])
split(t(), String.t(), [term()]) :: [String.t()]
Разбивает заданную строку на основе заданного шаблона и в заданном количестве частей.
Параметры
-
:parts- при указании, разбивает строку на заданное количество частей. Если не указано,:partsпо умолчанию:infinity, что будет разбивать строку на максимальное возможное количество частей на основе заданного шаблона. -
:trim- при указании, удаляет пустые строки ("") из результата. -
:on- определяет, какие группы использовать для разделения строки и в каком порядке. По умолчанию:first, что означает, что группы внутри регулярного выражения не влияют на процесс разделения. -
:include_captures- при указании, включает в результат совпадения регулярного выражения. По умолчанию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"] version()
Возвращает версию используемого движка регулярных выражений.
© 2012 Plataformatec
Licensed under the Apache License, Version 2.0.
https://hexdocs.pm/elixir/1.5.3/Regex.html