Тут уже должен быть ответ "Используй RegExp".
А без них - что-то вроде этого:
Код:
n := 500;
i := 1;
s1 := '';
sresult := '';
while i <= length(s) do
begin
if s[i] in ['0'..'9'] then
s1 := s1 + s[i]
else
begin
if s1 <> '' then
begin
// тут s1 содержит очередное число
num := StrToInt(s1);
if num < n then
sresult := sresult + IntToStr(num - 1)
else
sresult := sresult + s1;
s1 := '';
end;
sresult := sresult + s[i];
end;
inc(i);
end;
// крайний случай (число в конце текста)
if s1 <> '' then
begin
num := StrToInt(s1);
if num < n then
sresult := sresult + IntToStr(num - 1)
else
sresult := sresult + s1;
end;
writeln(sresult);
readln;
Для заданного примера '[52, c.34-78; 137, c.56-98]' выход [51, c.33-77; 137, c.55-97] при N = 100.
Можно модифицировать, чтобы не по одному символу в строку прибавлять, а блоками.