Spec-Zone.ru › Elixir 1.14

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 для проверки версии во время выполнения и повторной компиляции регулярного выражения при необходимости.

END_OF_DOCUMENT_MARKER

Краткое описание

Типы

t()

Функции

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()
}
END_OF_DOCUMENT_MARKER

Функции

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

Данная функция устарела. Используйте Kernel.is_struct/2 или сопоставление шаблона с %Regex{} вместо этого.

Возвращает 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

Spec-Zone.ru

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