Модуль 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_matchStr.search_forwardStr.search_backwardStr.string_partial_matchStr.global_substituteStr.substitute_first
при условии, что ни одна из следующих функций не была вызвана между ними:
Str.global_replaceStr.replace_firstStr.splitStr.bounded_splitStr.split_delimStr.bounded_split_delimStr.full_splitStr.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
|
|
| Delim of
|
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