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

Глава 15

Проверка, первое совпадение и группы

Проверка текста на соответствие образцу, получение первого найденного фрагмента и извлечение из него отдельной части решаются тремя функциями. REGEXISMATCH отвечает, есть ли совпадение вообще, REGEXMATCH возвращает первое полное совпадение, а REGEXEXTRACT достаёт из него выбранную группу.

REGEXISMATCH

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

Синтаксис

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

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

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

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

Аргументы

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

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

Функция возвращает логическое значение типа BOOLEAN: TRUE, если совпадение найдено, и FALSE, если совпадений нет.

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

Функция ищет совпадение внутри текста. Чтобы проверить весь текст строго до последнего символа, задайте границы \A и \z, например "\Aa\d+\z". Граница $ также допускает позицию перед завершающим LF, поэтому "^a\d+$" принимает текст "a1" + CHR(10). Для строк с CRLF режим m не убирает CR: при необходимости явно учитывайте его в шаблоне, например "^a\d+\r?$". Пустое совпадение также считается найденным: вызов REGEXISMATCH("", "^$") возвращает TRUE.

Диагностика

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

Пример

PRINT REGEXISMATCH("A12", "\d+")
PRINT REGEXISMATCH("A12", "^a\d+$", "i")

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

TRUE
TRUE

REGEXMATCH

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

Синтаксис

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

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

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

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

Аргументы

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

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

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

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

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

Диагностика

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

Пример

PRINT REGEXMATCH("Order 42 and 100", "\d+")
PRINT "[" + REGEXMATCH("Order", "\d+") + "]"

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

42
[]

REGEXEXTRACT

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

Синтаксис

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

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

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

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

Аргументы

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

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

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

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

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

Если группа захватывается несколько раз в одном совпадении, функция возвращает последний захват. Например, REGEXEXTRACT("abc", "([a-z])+", 1) возвращает "c". Обычные неназванные группы получают номера раньше именованных: в шаблоне "(?<letter>a)(b)" группа 1 содержит "b", группа 2 — "a". Явно заданный числовой номер, например 10, сохраняется.

Диагностика

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

Пример

PRINT REGEXEXTRACT("A12", "([A-Z])(\d+)", 2)
PRINT REGEXEXTRACT("a12", "([A-Z])(\d+)", 1, "i")

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

12
a

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

См. также