Smitis
Вы можете ответить тут о проблемах. Я там особо ничего не менял, смысл остался прежним. Я заменил формирование результата через список, что позволило быстро объединять строки копируя память (это я почерпнул из примера Петра, когда он давал мне код поиска файлов и код медленно объединял строки и он дал пример через копирование памяти), так как объединение переменных работает медленно за счёт перевыделения памяти. И вычисление групп вынес из цикла, так как группы в рег.выр.е не изменяются, поэтому нет смысла например 1000 раз запрашивать количество групп, их всегда будет одно и тоже для текущего рег.выр.а. Так что я сделал оптимизацию и выложил. А остальные 3 варианта из 4-х работают менее стабильно, то не кроссплатформенно, то просто глюки, либо работают только при определённых условиях. А эта функция работает идеально везде. Единственное её ограничение это от 0 до 9 групп (в AutoIt3 нет ограничения), можно было бы сделать как в AutoIt3 но в 99.999% это не пригодится, там если групп больше 10 то используется синтаксис \{99}, ради этого придётся немного усложнить анализатор, грубо говоря искать в тексте замены конструкцию \\\{d+\}, но я сделаю это, когда придётся использовать рег.выр. с более чем 10 групп.
Smitis написал(а):в них легко получить ошибочный результат
Всмысле, что \1 может оказаться текстом а не группой? Ну так это от пользователя зависит, если это введено как правило воспринимать \1 как группу, то просто надо это учитывать, а не считать это ошибкой.
Или вы хотите вместо ReplaceString использовать ReplaceRegularExpression, чтобы запретить группы методом экранирования \\1, типа искать \1 перед которым нет двойной наклонной черты \\? Типа такого рег.выр (?<!\\)\\\d или (?<!\\)(?:\\\\)*\K(\\\d) где если нечётное число \\ перед цифрой, то это воспринимается как группа.
Можно добавить IsRegularExpression(#RegularExpression), чтобы перед использованием проверить что этот рег.выр. прошёл валидацию.
Отредактировано AZJIO (20.05.2022 14:31:22)