Документация HotXLS

API бэкенда регулярных выражений

lxRegex открывает доступ к TXLSRegex — бэкенду с состоянием, который используют функции регулярных выражений калькулятора; обычным вызывающим книги достаточно API формул, описанных в разделе контекстное вычисление формул

Бэкенд использует поставляемую в комплекте 16-битную сборку PCRE2 10.49 с режимом UTF, автоматическими callout'ами бюджета и без JIT, со статическими объектами для Delphi и C++Builder на Windows и поддерживаемыми FPC на Linux x64 или macOS ARM64; неподдерживаемые целевые платформы сообщают xrsUnavailable

Каждый экземпляр владеет своим скомпилированным шаблоном, аллокатором и контекстами сопоставления; создавайте отдельный экземпляр для каждой одновременной операции и держите владельца callback'а бюджета живым, пока экземпляр не освобождён

Публичное объявлениеКонтракт
TXLSRegex.Create(ABudget: TXLSRegexBudget)Выделяет контексты бэкенда и удерживает необязательный callback; передайте nil, если бюджет вызывающего не нужен, затем осматривайте результаты операций и Status
TXLSRegex.DestroyОсвобождает скомпилированный шаблон, данные сопоставления и контексты; вызывающие обычно вызывают Free в блоке finally
TXLSRegex.Compile(Pattern, IgnoreCase): BooleanКомпилирует UTF-16-шаблон и готовит его хранилище захвата, заменяя прежний шаблон; IgnoreCase включает регистронезависимое сопоставление PCRE2, а False оставляет сопоставление чувствительным к регистру
TXLSRegex.Match(Text, Offset, NonemptyAtStart, out Offsets): BooleanТребует успешной компиляции, ищет от смещения UTF-16 с отсчётом от нуля и возвращает отсоединённые смещения захвата; NonemptyAtStart=True запрашивает привязанное непустое совпадение в точном смещении, что позволяет продвигаться мимо пустого совпадения
TXLSRegex.Replace(Text, Replacement, Occurrence, out Value): BooleanТребует успешной компиляции и использует синтаксис замены PCRE2, включая нумерованные и именованные ссылки на группы захвата; ноль выбирает все совпадения, положительное значение — вхождение с отсчётом от 1 от начала, а отрицательное считает с конца
TXLSRegex.Check(AWork, AExtraBytes): BooleanВызывает callback бюджета с текущим приращением работы и резидентными байтами бэкенда плюс AdditionalBytes и предлагаемыми дополнительными байтами; отрицательный учёт байтов, целочисленное переполнение или зафиксированный терминальный статус возвращает False
TXLSRegex.Status: TXLSRegexStatusСтатус только для чтения для последней операции или терминального состояния бюджета/бэкенда; используйте его после возврата False операцией, чтобы отличить отсутствие совпадения от сбоя
TXLSRegex.CaptureCount: CardinalКоличество явных групп захвата, сообщённое последним скомпилированным шаблоном, только для чтения, без слота полного совпадения; используйте после успешного Compile
TXLSRegex.AdditionalBytes: Int64Учёт временных буферов вызывающего, которые должны участвовать в каждой проверке бюджета, чтение и запись; по умолчанию ноль и сам память не выделяет

Смещения, вывод и поведение замены

TXLSRegexOffsets — динамический массив NativeUInt с двумя элементами на слот; слот ноль содержит полное совпадение, за которым следуют явные группы захвата в порядке объявления

Каждая пара — начало с отсчётом от нуля и исключающий конец, измеренные в кодовых единицах UTF-16, а не в индексах строк Delphi с отсчётом от 1 и не в позициях Unicode-скаляров; неустановленный необязательный захват использует High(NativeUInt) для обоих концов

Match очищает свой выходной массив перед каждой попыткой; Replace очищает выход перед началом, а успешная замена без выбранного вхождения возвращает исходный текст с xrsOk

Ссылки замены используют долларовую нотацию PCRE2, например $1 и ${name}; неучаствующий захват даёт пустую строку, а неверная ссылка замены сообщает xrsInvalidReplacement

Успешно вызовите Compile до сопоставления или замены; вызов без подготовленного шаблона возвращает False и не изготавливает статус ошибки шаблона

Callback бюджета

TXLSRegexBudget = function(AWork, ABytes: Int64): Boolean of object получает приращение работы для накопления и текущую оценку байтов для сравнения с лимитом вызывающего; ABytes — не дельта выделения памяти

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

Возврат False или исключение из callback'а прерывает операцию с xrsAborted; исключения callback'ов не вылетают сквозь нативный бэкенд

xrsResourceLimit, xrsAborted и xrsUnavailable терминальны для этого экземпляра, поэтому после таких состояний создайте новый экземпляр перед повторной попыткой; ошибки неверного шаблона или текста не накладывают эту терминальную фиксацию

Значения статусов

Значение TXLSRegexStatusСмысл
xrsOkОперация бэкенда завершилась успешно
xrsNoMatchТекущий поиск совпадения не нашёл совпадения
xrsInvalidPatternШаблон не удалось скомпилировать, включая неверную кодировку шаблона
xrsInvalidReplacementВыражение замены отклонено, либо ошибка бэкенда не попала в явные сопоставления статусов
xrsInvalidTextСопоставление или подстановка столкнулись с явно классифицированной ошибкой входа UTF-16 или границы символов
xrsResourceLimitВыделение бэкенда, внутренний лимит сопоставления или лимит учёта байтов помешал завершению
xrsAbortedCallback бюджета остановил операцию, его callback выбросил исключение, либо нативный callout прервал сопоставление
xrsUnavailableУ целевой платформы нет поддерживаемого поставляемого статического бэкенда

Калькулятор отображает эти статусы бэкенда в собственные ошибки формул и диагностику вычисления; эти прямые API бэкенда не возвращают Excel-варианты ошибок