Как она работает. Переменная i получает позицию нахождения подстроки S2 в строке S. Если при этом позиция находится не на первом символе, в строку результата S4 копируется фрагмент строки до указанной позиции (фрагмент Copy (S,1,i-1), к нему прибавляется «слово» -замена S3, и оставшийся фрагмент текста за минусом уже полученного фрагмента с учетом стоявшего ранее на этом месте слова (фрагмент Copy (s,i+length (s2),length (s) -length (s2) -i+1)).

В операции замены первого слова есть небольшое различие – первым сразу становится подстрока замены S3.

Предположим, в строке «Мама мыла раму» нам необходимо заменить слово «раму» на «окно».

Замена производится в одно действие:



В данном случае переменная s2 получит измененную строку «Мама мыла окно». А в случае, если искомая подстрока не будет найдена, переменная S4 вернет в программу исходную строку S.

Но здесь необходимо учесть один момент. В случае, когда в текстовой строке встречается несколько раз одно и то же заменяемое слово, (например, слово «быть» в строке «быть или не быть»), процедуру следует повторить. Поскольку нам неизвестно, сколько раз во фразе может встретиться слово (или символ, или группа символов), один, три раза или 100 раз, мы можем усовершенствовать процедуру для того, чтобы она заменяла их все до тех пор, пока искомой подстроки в строке не останется. Здесь можно применить цикл Repeat с условием выхода.

Видоизменим процедуру InsInString, добавив цикл.


Илл. 22. Усовершенствованная процедура InInstring прекращает заменять подстроку только тогда, когда заменять остается нечего.


Еще одним необходимым элементом нормализации текста является его преобразование из строчного написания в заглавное для удобства последующего оперирования.27

То есть наша строка «Мама мыла раму» после обработки должна выглядеть как «МАМА МЫЛА РАМУ», где все буквы являются прописными, большими.

Приведенная ниже процедура Getups преобразует строку таким образом, что все символы, написанные строчными буквами становятся прописными, а все прочие символы – копирует в той же позиции. Для этого процедура, которая работает со строкой использует другую процедуру, (Getup), которая производит ту же операцию, но на уровне 1 символа.


Илл. 23. Процедуры «поднятия» букв из строчных в прописные GetUps (для строк) и GetUp (для отдельного символа).


Ознакомившись с ними вы можете сделать вывод о принципе их работы. Чтобы не заменять все буквы по одной, процедура GetUp работает с диапазонами кодировок символов, меняя их нужным образом. В данном случае это уже упомянутые диапазоны кодировки DOS: английские строчные буквы от a до z (коды 97—122) и русские строчные буквы от а до я (коды 160—175, 224—239). Определив «попадание» в строчную кодировку мы уже знаем, в какую «сторону» и на какое число следует изменить код, вычесть или прибавить. В частности, для изменения английских строчных символов из кода символа вычитается число 32; а в русских, – до буквы «п» также вычитается 32, с буквы «р» – вычитается 80.


Поскольку процедура Getups изначально готовилась как процедура нормализации, по своему опыту в ней сразу использовались и дополнительные подготовительные элементы как вложенная процедура Deldbspace – удаления двойных и тройных пробелов, а также пробелов, стоящих перед началом и в конце строки:


Илл.24. Процедура «очистки» строки от двойных-тройных пробелов, а также пробелов в начале и в конце строки.


Теперь постараемся подытожить то, что мы получили.

С помощью описанных процедур мы можем нормализовать текст, используя буквально несколько операторов.