ГРУППЫ И ГРУППОВЫЕ ВЫРАЖЕНИЯ

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