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

Глава 15

Все совпадения и разбиение

Когда подходящих фрагментов в тексте несколько, одного совпадения уже недостаточно: нужен весь набор, а иногда — значения одной и той же группы в каждом из них. REGEXMATCHES извлекает все полные совпадения, REGEXEXTRACTALL извлекает значения выбранной группы, REGEXSPLIT разбивает текст по шаблону. Все три возвращают одномерный массив строк STRING[].

REGEXMATCHES

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

Синтаксис

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

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

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

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

Аргументы

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

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

Функция создаёт новый одномерный массив строк STRING[]. Индекс первого элемента равен 1. Пустой результат остаётся выделенным массивом: его нижняя граница равна 1, верхняя — 0, а длина — 0.

Элементы содержат полные совпадения в порядке поиска слева направо.

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

Если совпадений нет, функция возвращает пустой массив. Пустой исходный текст не обязательно даёт пустой результат: шаблон "^$" совпадает с пустой строкой, поэтому результат содержит один элемент — пустую строку.

Диагностика

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

Пример

DIM values[] AS STRING
values[] = REGEXMATCHES("Order 42 and 100", "\d+")
PRINT values[1]
PRINT values[2]

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

42
100

REGEXEXTRACTALL

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

Синтаксис

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

REGEXEXTRACTALL(<текст>, <шаблон>, <номер группы>)

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

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

Аргументы

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

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

Функция создаёт новый одномерный массив строк STRING[]. Индекс первого элемента равен 1. Пустой результат остаётся выделенным массивом: его нижняя граница равна 1, верхняя — 0, а длина — 0.

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

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

Номер группы обозначает именно её номер в регулярном выражении. Например, (?<10>...) создаёт группу с номером 10. Номер 0 возвращает полные совпадения. Если совпадений нет, массив пуст. Для пустого текста результат зависит от того, может ли шаблон совпасть с пустой строкой.

Каждый элемент содержит последний захват выбранной группы внутри соответствующего полного совпадения, а не все повторные захваты. Например, шаблон "([a-z])+" на тексте "abc def" с номером группы 1 возвращает элементы "c" и "f".

Диагностика

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

Пример

DIM values[] AS STRING
values[] = REGEXEXTRACTALL("A12 B34", "([A-Z])(\d+)", 2)
PRINT values[1]
PRINT values[2]

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

12
34

Пример с явно пронумерованной группой: explicit_group_values.axm.

REGEXSPLIT

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

Синтаксис

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

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

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

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

Аргументы

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

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

Функция создаёт новый одномерный массив строк STRING[]. Индекс первого элемента равен 1. Пустой результат остаётся выделенным массивом: его нижняя граница равна 1, верхняя — 0, а длина — 0.

Элементы содержат части исходного текста в исходном порядке. Захватывающие группы шаблона-разделителя также включаются в результат.

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

Разделитель в начале, в конце или рядом с другим разделителем создаёт пустую часть. Если разделитель не найден в непустом тексте, результат содержит один элемент — весь исходный текст. Для пустого исходного текста функция всегда возвращает пустой массив.

Диагностика

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

Пример

Шаблон "[,;]\s*" задаёт запятую или точку с запятой и любое количество пробельных символов после неё.

DIM parts[] AS STRING
parts[] = REGEXSPLIT("one, two;three", "[,;]\s*")
PRINT parts[1]
PRINT parts[2]
PRINT parts[3]

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

one
two
three

Запускаемые примеры

См. также