Spec-Zone.ru › OCaml

Модуль Str

module Str: sig .. end

Регулярные выражения и обработка строк высокого уровня

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

Библиотека Str предоставляет регулярные выражения для последовательностей байтов. Она, как правило, не подходит для сопоставления символов Юникода.

type regexp 

Тип скомпилированных регулярных выражений.

val regexp : string -> regexp

Компилирует регулярное выражение. Разрешены следующие конструкции:

  • .      Сопоставляет любой символ, кроме новой строки.
  • *      (постфикс) Сопоставляет предыдущее выражение ноль, один или несколько раз.
  • +      (постфикс) Сопоставляет предыдущее выражение один или несколько раз.
  • ?      (постфикс) Сопоставляет предыдущее выражение один раз или ни разу.
  • [..]   Множество символов. Диапазоны обозначаются с помощью -, как в [a-z]. Начальное ^, как в [^0-9], дополняет множество. Для включения символа ] в множество, сделайте его первым символом множества. Для включения символа - в множество, сделайте его первым или последним символом множества.
  • ^      Сопоставляет начало строки: либо в начале сопоставляемой строки, либо сразу после символа '\n'.
  • $      Сопоставляет конец строки: либо в конце сопоставляемой строки, либо непосредственно перед символом '\n'.
  • \| (инфикс) Альтернатива между двумя выражениями.
  • \(..\) Группировка и именование заключённого выражения.
  • \1 Текст, сопоставленный с первым \(...\) выражением (\2 для второго выражения и так далее до \9).
  • \b Сопоставляет границы слов.
  • \ Цитаты специальных символов. Специальные символы — $^\.*+?[].

В регулярных выражениях часто используются символы обратного слэша; проще использовать строковый литерал {|...|} для предотвращения необходимости экранирования обратных слэшей.

Например, следующее выражение:

 let r = Str.regexp {|hello \([A-Za-z]+\)|} in
      Str.replace_first r {|\1|} "hello world" 

возвращает строку "world".

Если вам нужно регулярное выражение, которое соответствует символу обратного слэша, вам нужно удвоить его: Str.regexp {|\\|}.

Вы также можете использовать обычные строковые литералы "...", однако вам придётся экранировать обратные слэши. Приведённый выше пример можно переписать с использованием обычного строкового литерала, как:

 let r = Str.regexp "hello \\([A-Za-z]+\\)" in
      Str.replace_first r "\\1" "hello world" 

А регулярное выражение для соответствия символу обратного слэша становится четырёхкратным обратным слэшем: Str.regexp "\\\\".

val regexp_case_fold : string -> regexp

То же, что и regexp, но скомпилированное выражение будет сопоставлять текст без учёта регистра: заглавные и строчные буквы будут считаться эквивалентными.

val quote : string -> string

Str.quote s возвращает строку regexp, которая точно соответствует s и ничему другому.

val regexp_string : string -> regexp

Str.regexp_string s возвращает регулярное выражение, которое точно соответствует s и ничему другому.

val regexp_string_case_fold : string -> regexp

Str.regexp_string_case_fold аналогичен Str.regexp_string, но regexp соответствует без учёта регистра.

Сопоставление и поиск в строках

val string_match : regexp -> string -> int -> bool

string_match r s start проверяет, совпадает ли подстрока s, начинающаяся с позиции start, с регулярным выражением r. Первый символ строки имеет позицию 0, как обычно.

val search_forward : regexp -> string -> int -> int

search_forward r s start ищет в строке s подстроку, соответствующую регулярному выражению r. Поиск начинается с позиции start и продолжается к концу строки. Возвращает позицию первого символа сопоставленной подстроки.

  • Возбуждает Not_found если ни одна подстрока не совпадает.
val search_backward : regexp -> string -> int -> int

search_backward r s last ищет в строке s подстроку, соответствующую регулярному выражению r. Поиск сначала рассматривает подстроки, начинающиеся с позиции last, и продолжается к началу строки. Возвращает позицию первого символа сопоставленной подстроки.

  • Возбуждает Not_found если ни одна подстрока не совпадает.
val string_partial_match : regexp -> string -> int -> bool

Аналогично Str.string_match, но также возвращает true, если строка-аргумент является префиксом строки, которая соответствует. Это включает случай точного полного соответствия.

val matched_string : string -> string

matched_string s возвращает подстроку s, которая была сопоставлена последним вызовом одной из следующих функций сопоставления или поиска:

  • Str.string_match
  • Str.search_forward
  • Str.search_backward
  • Str.string_partial_match
  • Str.global_substitute
  • Str.substitute_first

при условии, что ни одна из следующих функций не была вызвана между ними:

  • Str.global_replace
  • Str.replace_first
  • Str.split
  • Str.bounded_split
  • Str.split_delim
  • Str.bounded_split_delim
  • Str.full_split
  • Str.bounded_full_split

Примечание: в случае global_substitute и substitute_first, вызов matched_string допустим только в пределах аргумента subst, а не после того, как global_substitute или substitute_first возвращают значения.

Пользователь должен убедиться, что параметр s — та же строка, которая была передана в функцию сопоставления или поиска.

val match_beginning : unit -> int

match_beginning() возвращает позицию первого символа подстроки, которая была сопоставлена последним вызовом функции сопоставления или поиска (см. Str.matched_string для получения дополнительных сведений).

val match_end : unit -> int

match_end() возвращает позицию символа, следующего за последним символом подстроки, которая была сопоставлена последним вызовом функции сопоставления или поиска (см. Str.matched_string для получения дополнительных сведений).

val matched_group : int -> string -> string

matched_group n s возвращает подстроку s, которая была сопоставлена n-й группой \(...\) регулярного выражения, которое было сопоставлено последним вызовом функции сопоставления или поиска (см. Str.matched_string для получения дополнительных сведений). Когда n равно 0, возвращается подстрока, соответствующая всему регулярному выражению. Пользователь должен убедиться, что параметр s — та же строка, которая была передана в функцию сопоставления или поиска.

  • Возбуждает Not_found если n-я группа регулярного выражения не была сопоставлена. Это может произойти в группах внутри альтернатив \|, опций ? или повторений *. Например, пустая строка будет соответствовать \(a\)*, но matched_group 1 "" вызовет Not_found, потому что сама первая группа не была сопоставлена.
val group_beginning : int -> int

group_beginning n возвращает позицию первого символа подстроки, которая была сопоставлена n-й группой регулярного выражения, которое было сопоставлено последним вызовом функции сопоставления или поиска (см. Str.matched_string для получения дополнительных сведений).

  • Возбуждает
    • Not_found если n-я группа регулярного выражения не была сопоставлена.
    • Invalid_argument если в регулярном выражении меньше, чем n групп.
val group_end : int -> int

group_end n возвращает позицию символа, следующего за последним символом подстроки, которая была сопоставлена n-й группой регулярного выражения, которое было сопоставлено последним вызовом функции сопоставления или поиска (см. Str.matched_string для получения дополнительных сведений).

  • Возбуждает
    • Not_found если n-я группа регулярного выражения не была сопоставлена.
    • Invalid_argument если в регулярном выражении меньше, чем n групп.

Замена

val global_replace : regexp -> string -> string -> string

global_replace regexp templ s возвращает строку, идентичную s, за исключением того, что все подстроки s, которые соответствуют regexp, были заменены на templ. Шаблон замены templ может содержать \1, \2, и т. д.; эти последовательности будут заменены текстом, сопоставленным соответствующей группе в регулярном выражении. \0 обозначает текст, сопоставленный всему регулярному выражению.

val replace_first : regexp -> string -> string -> string

Аналогично Str.global_replace, за исключением того, что заменяется только первая подстрока, соответствующая регулярному выражению.

val global_substitute : regexp -> (string -> string) -> string -> string

global_substitute regexp subst s возвращает строку, идентичную s, за исключением того, что все подстроки s , соответствующие regexp, были заменены результатом функции subst. Функция subst вызывается один раз для каждой соответствующей подстроки и получает s (весь текст) в качестве аргумента.

val substitute_first : regexp -> (string -> string) -> string -> string

Аналогично Str.global_substitute, за исключением того, что заменяется только первая подстрока, соответствующая регулярному выражению.

val replace_matched : string -> string -> string

replace_matched repl s возвращает текст замены repl, в котором \1, \2, и т. д. были заменены текстом, соответствующим соответствующим группам в регулярном выражении, которое было сопоставлено последним вызовом функции сопоставления или поиска (см. Str.matched_string для подробностей). s должна быть той же самой строкой, которая была передана функции сопоставления или поиска.

Разбиение

val split : regexp -> string -> string list

split r s разбивает s на подстроки, принимая в качестве разделителей подстроки, соответствующие r, и возвращает список подстрок. Например, split (regexp "[ \t]+") s разбивает s на слова, разделенные пробелами. Встречаемость разделителя в начале или в конце строки игнорируется.

val bounded_split : regexp -> string -> int -> string list

Аналогично Str.split, но разбивает на не более чем n подстрок, где n - дополнительный целочисленный параметр.

val split_delim : regexp -> string -> string list

Аналогично Str.split, но вхождения разделителя в начале и в конце строки распознаются и возвращаются в результате в виде пустых строк. Например, split_delim (regexp " ") " abc " возвращает [""; "abc"; ""], в то время как split с теми же аргументами возвращает ["abc"].

val bounded_split_delim : regexp -> string -> int -> string list

Аналогично Str.bounded_split, но вхождения разделителя в начале и в конце строки распознаются и возвращаются в результате в виде пустых строк.

type split_result = 
| Text of string
| Delim of string
val full_split : regexp -> string -> split_result list

Аналогично Str.split_delim, но возвращает также разделители и подстроки, находящиеся между разделителями. Первые помечены Delim в списке результатов; последние помечены Text. Например, full_split (regexp "[{}]") "{ab}" возвращает [Delim "{"; Text "ab"; Delim "}"].

val bounded_full_split : regexp -> string -> int -> split_result list

Аналогично Str.bounded_split_delim, но возвращает также разделители и подстроки, находящиеся между разделителями. Первые помечены Delim в списке результатов; последние помечены Text.

Извлечение подстрок

val string_before : string -> int -> string

string_before s n возвращает подстроку всех символов s , предшествующих позиции n (исключая символ в позиции n).

val string_after : string -> int -> string

string_after s n возвращает подстроку всех символов s , следующих за позицией n (включая символ в позиции n).

val first_chars : string -> int -> string

first_chars s n возвращает первые n символов s. Это та же функция, что и Str.string_before.

val last_chars : string -> int -> string

last_chars s n возвращает последние n символов s.

© 1995-2024 INRIA.
https://ocaml.org/manual/5.2/api/Str.html

Spec-Zone.ru

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