Spec-Zone.ru › OCaml

Модуль Str

module Str: sig .. end

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

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

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

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 возвращает строку регулярного выражения, которая соответствует в точности 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, но регулярное выражение выполняет сопоставление без учёта регистра.

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

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

string_match r s start проверяет, соответствует ли регулярному выражению r подстрока s, начинающаяся в позиции start. Как обычно, первый символ строки находится в позиции 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-2026 INRIA.
https://ocaml.org/manual/5.5/api/Str.html

Spec-Zone.ru

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