Axiom Справочник языка

Глава 15

Замена и подсчёт совпадений

Найденные по шаблону фрагменты не всегда нужно извлекать: иногда их заменяют на новый текст или просто пересчитывают. REGEXREPLACE возвращает копию текста с заменёнными совпадениями, REGEXCOUNT сообщает, сколько совпадений нашлось. Формы записи у этих функций разные.

Предельная длина замены

Во всех формах REGEXREPLACE результат ограничен 16 777 216 кодовыми единицами UTF-16. Превышение вызывает перехватываемую ошибку MB3007; частичный результат не возвращается. Ограничение относится к полученной строке, включая текст подстановок. См. предел STRING.

REGEXREPLACE

Функция REGEXREPLACE заменяет совпадения с регулярным выражением и возвращает полученную строку. Она позволяет заменить фрагменты, описанные правилом: например, скрыть все числа или переставить части найденного кода. Вызов выполняется в выражении и не требует открытия экрана, холста или файла.

Синтаксис

Четыре поддерживаемые формы вызова:

REGEXREPLACE(<текст>, <шаблон>, <замена>)
REGEXREPLACE(<текст>, <шаблон>, <замена>, <режимы>)
REGEXREPLACE(<текст>, <шаблон>, <замена>, <количество>)
REGEXREPLACE(<текст>, <шаблон>, <замена>, <режимы>, <количество>)

Аргументы

АргументЧто передать
<текст>Передайте строку типа STRING, в которой функция должна искать совпадения.
<шаблон>Передайте строку типа STRING с регулярным выражением, которое задаёт искомые совпадения.
<режимы>Необязательная строка типа STRING задаёт режимы поиска. Буква i отключает различение регистра, m позволяет ^ и $ обозначать границы отдельных строк, s позволяет точке совпадать с переводом строки, а x разрешает пробелы и комментарии в шаблоне. Буквы можно сочетать, например "im"; регистр букв не имеет значения. По умолчанию дополнительные режимы выключены.
<замена>Передайте строку типа STRING с текстом замены. В ней можно использовать ссылки на захватывающие группы, например $1 и $2.
<количество>Передайте неотрицательное целое число типа INTEGER, ограничивающее число замен. Если аргумент отсутствует, заменяются все совпадения. Значение 0 запрещает замену.

Возвращаемое значение

Функция возвращает строку типа STRING. Исходное строковое значение не изменяется. Если совпадений нет, функция возвращает исходный текст.

Правила и пограничные случаи

При заданном количестве замен функция обрабатывает первые совпадения слева направо. После достижения предела оставшаяся часть текста переносится без изменений. Если количество равно 0, функция возвращает исходный текст без проверки шаблона и режимов; выражения всех аргументов при этом вычисляются.

Пустой текст может содержать пустое совпадение. Например, замена шаблона "^$" на "x" в пустой строке даёт строку "x".

Подстановки в строке замены

ЗаписьРезультат
$$Буквальный знак доллара.
$&, $0Всё совпадение.
$1, ${1}Захват группы с указанным номером.
${name}Захват именованной группы.
$+Значение последней группы по порядку нумерации движка.
$`Исходный текст слева от совпадения.
$'Исходный текст справа от совпадения.
$_Весь исходный текст.

Существующая группа, которая не участвовала в совпадении, подставляет пустую строку. Ссылка на несуществующую группу, например $9 или ${missing}, сохраняется буквально. Для отделения номера от последующих цифр используйте фигурные скобки. В повторяющейся группе подставляется последний захват. Подстановки используют исходный текст, а не уже построенную часть результата.

PRINT REGEXREPLACE("A12 B34", "(?<letter>[A-Z])(\d+)", "${letter}-$1")
PRINT REGEXREPLACE("a", "a", "$$$&")
PRINT REGEXREPLACE("a", "a", "${missing}")

Вывод: A-12 B-34, $a, ${missing}.

Диагностика

Ошибка MB3007 возникает при отрицательном количестве замен, недопустимом шаблоне, неизвестной букве режима, ошибке разбора строки замены или превышении пятисекундного предела поиска. При количестве 0 шаблон, режимы и строка замены не проверяются.

Пример

PRINT REGEXREPLACE("one 12 two 34", "\d+", "#")
PRINT REGEXREPLACE("one 12 two 34", "\d+", "#", 1)
PRINT REGEXREPLACE("A12 B34", "([A-Z])(\d+)", "$1-$2")

Программа выводит:

one # two #
one # two 34
A-12 B-34

Дополнительный пример: stop_at_count.axm.

REGEXCOUNT

Функция REGEXCOUNT возвращает количество совпадений с регулярным выражением. Она подходит, когда требуется только число найденных фрагментов, без массива их текстовых значений. Вызов выполняется в выражении и не требует открытия экрана, холста или файла.

Синтаксис

Вызов без дополнительных режимов:

REGEXCOUNT(<текст>, <шаблон>)

Вызов с явно заданными режимами:

REGEXCOUNT(<текст>, <шаблон>, <режимы>)

Аргументы

АргументЧто передать
<текст>Передайте строку типа STRING, в которой функция должна искать совпадения.
<шаблон>Передайте строку типа STRING с регулярным выражением, которое задаёт искомые совпадения.
<режимы>Необязательная строка типа STRING задаёт режимы поиска. Буква i отключает различение регистра, m позволяет ^ и $ обозначать границы отдельных строк, s позволяет точке совпадать с переводом строки, а x разрешает пробелы и комментарии в шаблоне. Буквы можно сочетать, например "im"; регистр букв не имеет значения. По умолчанию дополнительные режимы выключены.

Возвращаемое значение

Функция возвращает неотрицательное целое число типа INTEGER. Если совпадений нет, функция возвращает 0.

Правила и пограничные случаи

Функция считает совпадения без создания массива и без сохранения объектов всех совпадений. Пустые совпадения также входят в счёт. Поэтому вызов REGEXCOUNT("", "^$") возвращает 1.

Диагностика

Ошибка MB3007 возникает, если шаблон содержит недопустимое регулярное выражение, строка режимов содержит символ помимо i, m, s и x. Та же ошибка возникает, если поиск превышает установленный предел времени в пять секунд. Отсутствие совпадений ошибкой не является.

Пример

PRINT REGEXCOUNT("one 12 two 34", "\d+")
PRINT REGEXCOUNT("A12 b34", "[a-z]\d+", "i")

Программа выводит:

2
2

См. также