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