Мощным средством контекстного редактирования является определение и использование групп. В строке поиска допускается нахождение не более 9 групп, которые идентифицируются границами байтовых диапазонов для каждой найденной группы. Каждая группа в контексте поиска задается в граничных спецсимволах {…}. В соответствии со стандартными правилами, контекстная замена групп определяется номером n в контексте замены #n и местом положения этого подконтекста в полном контексте замены: порядок расположения подконтекста #n относительно всех групп в полном контексте замены соответствует номеру группы, которую надо заменить, а номер группы n - на какую группу надо заменить. Например, контекст замены #3#1#2 означает, что первая группа меняется на третью, вторая на первую, а третья на вторую
Вместо номера группы в контексте замены может быть задано групповое выражение, суть которого выполнить некоторые строковые или арифметические действия над содержимым найденных групп (полным или взятом в заданном диапазоне), а затем поместить результат по стандартным правилам работы с группами или в место, указанное в самом контексте. Таким образом, групповое выражение определяет вычисляемый контекст замены и может быть задано в одном из следующих вариантов:
#[<выражение>] #[<выражение>]/<место замены>/<режим замены> #[<выражение>]/<место замены> <выражение> - комбинация действий на основе конструкции <операнд> <операция> <операнд>, допускающая использование круглых скобок для задания порядка выполнения операций; <операнд> - одна из конструкций: <строковый операнд> или <групповой операнд> или <число>; <строковый операнд> - строка, заключенная в двойные кавычки ( "…" ); <групповой операнд> - конструкция вида: {n} или {n}|d0..d1 , где n - номер группы, содержимое которой надо взять, d0,d1 - начало и конец диапазона символов из группы n (конечный элемент может быть задан как -1); <число> - целое или вещественное для арифметических операций; <операция> - допустимы следующие операции (по убыванию приоритета): Max , Min , Abs , Int , Fruc , Sqr , Sqrt (встроенные функции) div , mod , * , / + , - & (объединение операндов в одну строку); <место замены> - см. конструкцию <групповой операнд>, допустимо значение группы замены равное 0, что означает что в качестве группы берется вся исходная строка; <режим замены> - r (заменить диапазон, режим работает по умолчанию) b (вставить перед начальным символом диапазона замены) e (вставить после конечного символа диапазона замены);
В записи группового выражения общие правила использования спецсимвола @ для "погашения" спецсимволов не действует, т.е. спецсимволы можно свободно использовать в строковых операндах наряду с обычными символами. Исключение составляет использование в строковом операнде спецсимвола $ (новая строка), что позволяет разбивать строку или вставлять в текст новые строки.
Вычисление выражения производится в соответствии с правилами арифметики над операндами, выделенными из найденных контекстных групп с учетом заданного диапазона, причем для арифметических операций эти операнды должны быть числовыми значениями. При задании места замены и режима замены возможности контекстного редактирования с использованием групп существенно возрастают. Если номер группы замены равен 0, то в режиме r вся исходная строка заменяется выражением, в режиме b выражение вставляется в начало строки, в режиме e выражение добавляется в конец строки.
Пример использования в контексте замены группового выражения: исходная строка: Х1:200 Х2:20 Х3:2 контекст поиска: {Х1:[~ ]+}{Х2:[~ ]+}{Х3:[~ ]+} контекст замены: #[">>>$Итог: " & ({1}|4..-1 + {2}|4..-1 + {3}|4..-1)]/{0}/r выходные строки: >>> Итог: 222Область действия группового контекста ограничивается текущей строкой редактирования, однако есть возможность сохранять нужные контексты в архиве контекстов и использовать их в течение одного сеанса редактирования. Признаком работы с архивным контекстом в групповом операнде является конструкция {{n}}, где n>=1 - номер контекста в архиве, определяемый номером группы, указанным в месте замены с помощью аналогичной конструкции {{n}}. Если в выражении используется архивный контекст, который к этому времени не был определен, то считается, что он пустой для строковой операции и равен нулю для арифметической операции.
Пример использования архивных контекстов: исходные строки: S1:1 S2:2 S1:10 S2:20 R1:00 R2:00 контекст поиска 1: {S:[~ ]+}{S:[~ ]+} контекст замены 1: #[{{1}}+{1}|4..-1]/{{1}} #[{{2}}+{2}|4..-1]/{{2}} контекст поиска 2: {R1:[~ ]+}{R2:[~ ]+} контекст замены 2: #[{{1}}]/{1}|4..-1 #[{{2}}]/{2}|4..-1 выходные строки: S1:1 S2:2 S1:10 S2:20 R1:11 R2:22