Глава 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
100REGEXEXTRACTALL
Функция 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