Заменить подстроку между соответствующими скобками

Задача: 

Написать функцию, заменяющую подстроку, которая начинается с первого вхождения в строку s открывающей квадратной скобки и заканчивается соответствующей ей закрывающей квадратной скобкой, на строку s1, и возвращающую подстроку, заключенную между скобками в качестве своего значения.

Описание переменных: 

Глобальные переменные:

  • s - исходная строка;
  • s_in - строка, на которую надо заменить найденную подстроку;
  • s_out - найденная подстрока в квадратных скобках.

Параметры функции:

  • fs - исходная строка, передается как параметр-переменная (т. е. при изменении ее значения внутри функции, будет изменено значение глобальной переменной);
  • fs_in - строка, которую надо вставить в исходную строку.

Переменные в функции:

  • p1 - позиция в строке открывающей скобки;
  • p2 - позиция в строке соответствующей скобки для p1;
  • count - счетчик открывающих скобок.
Алгоритм решения задачи: 
  1. Ищем первую квадратную скобку.
  2. Если скобка была найдена, то прекращаем данный цикл, фиксируем позицию скобки и выполняем остальные действия.
  3. Перебираем символы дальше. Если встретится открывающая скобка, то увеличиваем счетчик открывающих скобок.
  4. Если встретится закрывающая скобка, то проверяем, не равен ли нулю счетчик открывающих скобок. Если равен, то фиксируем позицию закрывающей скобки. Если не равен, то уменьшаем счетчик на 1.
  5. Если закрывающая скобка была найдена, то вырезаем из строки подстроку от открывающей до закрывающей скобок (и скобки тоже) и вставляем в это место новую подстроку.
Программа на языке Паскаль: 

var
    s, s_in, s_out: string;
 
function change_out2in(var fs: string; fs_in: string): string;
var p1, p2, i, count: byte;
begin
        p1 := 0;
        for i:=1 to length(fs) do 
                if fs[i] = '[' then begin
                        p1 := i;
                        break;
                end;
        p2 := 0;
        if p1  0 then begin
                count := 0;           
                for i:=p1+1 to length(fs) do
                        if fs[i] = '[' then count := count + 1
                        else
                                if fs[i] = ']' then 
                                        if count = 0 then begin
                                                p2 := i;
                                                break;
                                        end
                                        else count := count - 1;         
        end;
        if p2  0 then begin
                change_out2in := copy(fs,p1+1,p2-p1-1);
                delete(fs,p1,p2-p1+1);
                insert(fs_in,fs,p1);
        end
        else 
                change_out2in := 'BAD STRING. NOT CHANGE!';
 
end;
 
begin
        write('s: '); readln(s);
        write('s_in: '); readln(s_in);
 
        s_out := change_out2in(s, s_in);
 
    writeln('s: ', s);
    writeln('s_out: ', s_out);
end.

Результаты тестирования программы:

s: [what] big tee and [coffee]
s_in: hello
s: hello big tee and [coffee]
s_out: what
s: hello [who]...
s_in: iam
s: hello iam...
s_out: who
s: hello [bom [ye (ll]) ] trolls!
s_in: world
s: hello world trolls!
s_out: bom [ye (ll]) 
s: dk[kd[dkfj]
s_in: s
s: dk[kd[dkfj]
s_out: BAD STRING. NOT CHANGE!

Комментарии

Логика не совсем верная. К

Логика не совсем верная.

К примеру:

s: hello [bom [ye (ll]) ] trolls!
s_in: world
s: hello world trolls!     =>   а должно быть:            hello [bom world trolls!
s_out: bom [ye (ll]) 

так как отсчёт должен идти симметрично с конца.