Regex
Предоставляет регулярные выражения для Elixir.
Regex основан на PCRE (Perl Compatible Regular Expressions) и построен поверх модуля :re языка Erlang. Дополнительную информацию можно найти в документации модуля :re.
Регулярные выражения в Elixir можно создавать с помощью сигил ~r (см. sigil_r/2) или ~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
Модификаторы
Доступные модификаторы при создании Regex:
:unicode(u) - включает Unicode-специфичные шаблоны, такие как\p, и заставляет классы символов, такие как\w,\W,\s, и подобные, также соответствовать Unicode (см. примеры ниже в "Классы символов"). Ожидаются корректные строковые значения Unicode при сопоставлении.:caseless(i) - добавляет регистронезависимость:dotall(s) - заставляет точку соответствовать символам новой строки, а также устанавливает новую строку на anycrlf; установка новой строки может быть переопределена путем установки(*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
Захваты
Многие функции в этом модуле обрабатывают, что захватывать в результате сопоставления с помощью параметра :capture. Поддерживаемые значения:
:all- все захваченные подшаблоны, включая полную совпадающую строку (это значение по умолчанию):first- только первый захваченный подшаблон, который всегда является полной совпадающей частью строки; все явно захваченные подшаблоны отбрасываются:all_but_first- все, кроме первого совпадающего подшаблона, т.е. все явно захваченные подшаблоны, но не полная совпадающая часть строки:none- не возвращает совпадающих подшаблонов вообще:all_names- захватывает все совпадения именованных подшаблонов в Regex в виде списка, упорядоченного по алфавиту по именам подшаблоновlist(binary)- список именованных захватов для захвата
Классы символов
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. Предварительно скомпилированные регулярные выражения будут проверены во время выполнения и могут работать медленнее между операционными системами и выпусками OTP. Это редко проблема, так как большая часть кода Elixir, используемого во время разработки, компилируется на целевой системе (например, зависимости, архивы и скрипты escript), а при выполнении в рабочей среде код должен быть либо скомпилирован на целевой системе (через mix compile или аналогичный способ) или выпущен на хосте (через mix releases или аналогичный способ) с соответствующей версией OTP, операционной системой и архитектурой, как на целевой системе.
Если вам известно, что вы работаете на другой системе, чем текущая, и вы выполняете несколько сопоставлений с регулярным выражением, вы можете вручную вызвать Regex.recompile/1 или Regex.recompile!/1 для проверки версии во время выполнения и повторной компиляции регулярного выражения при необходимости.
Краткое описание
Типы
Функции
- compile(source, options \\ "")
Компилирует регулярное выражение.
- 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в случае ошибок.- regex?(term) deprecated
Возвращает
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()Source
@type t() :: %Regex{
opts: binary() | [term()],
re_pattern: term(),
re_version: term(),
source: binary()
} Функции
compile(source, options \\ "")Source
@spec compile(binary(), binary() | [term()]) :: {:ok, t()} | {:error, any()} Компилирует регулярное выражение.
Указанные опции могут быть либо двоичной строкой с символами, представляющими те же опции регулярного выражения, что и у ~r (см. sigil_r/2) сигил, либо списком опций, как ожидается модулем Erlang's :re.
Возвращает {:ok, regex} в случае успеха, {:error, reason} в противном случае.
Примеры
iex> Regex.compile("foo")
{:ok, ~r/foo/}
iex> Regex.compile("*foo")
{:error, {'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()) :: String.t() | [term()]
Возвращает опции регулярного выражения в виде строки или списка в зависимости от того, как оно было скомпилировано.
См. документацию по Regex.compile/2 для получения дополнительной информации.
Примеры
iex> Regex.opts(~r/foo/m)
"m"
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 в случае ошибок.
regex?(term)Source
Возвращает true если данное term является регулярным выражением. В противном случае возвращает false.
replace(regex, string, replacement, options \\ [])Source
@spec 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 \\ [])Source
@spec run(t(), binary(), [term()]) :: nil | [binary()] | [{integer(), integer()}] Запускает регулярное выражение по заданной строке до первого совпадения. Возвращает список со всеми совпадениями или nil если совпадения не найдено.
Опции
-
:return- при установке в:index, возвращает индекс байта и длину совпадения. По умолчанию:binary. -
:capture- что захватить в результате. Проверьте moduledoc дляRegex, чтобы увидеть возможные значения захвата. -
: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}] scan(regex, string, options \\ [])Source
@spec scan(t(), String.t(), [term()]) :: [[String.t()]] | [[{integer(), integer()}]] То же самое, что и run/3, но сканирует целевую строку несколько раз, собирая все совпадения регулярного выражения.
Возвращается список списков, где каждый элемент в главном списке представляет собой совпадение, а каждый элемент во вложенном списке представляет собой захваченное содержимое.
Опции
-
:return- при установке в:index, возвращает индекс байта и длину совпадения. По умолчанию:binary. -
:capture- что захватить в результате. Проверьте moduledoc дляRegex, чтобы увидеть возможные значения захвата. -
: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/\p{Sc}/u, "$, £, and €")
[["$"], ["£"], ["€"]]
iex> Regex.scan(~r/=+/, "=ü†ƒ8===", return: :index)
[[{0, 1}], [{9, 3}]] 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- приtrue, включает в результат совпадения регулярного выражения. Совпадения не учитываются в максимальном количестве частей, если объединены с параметром: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"] version()Source
@spec version() :: term()
Возвращает версию движка регулярных выражений.
© 2012 Plataformatec
Licensed under the Apache License, Version 2.0.
https://hexdocs.pm/elixir/1.14.1/Regex.html