Мощным средством контекстного редактирования является определение и использование групп. В строке поиска допускается нахождение не более 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