Функция StringReplace возвращает строку, полученную из строки
S заменой в ней подстроки OldPattern на подстроку
NewPattern . Если в параметр Flags включено значение
rfReplaceAll , то функция заменяет все подстроки OldPattern
входящие в строку S , иначе заменяется только первое вхождение подстроки.
Для того чтобы функция проводила замену без учета регистра, необходимо в параметр
Flags включить значение rfIgnoreCase .
function StringReplace(const S, OldPattern, NewPattern: string; Flags: TReplaceFlags): string;
где:
S – исходная строка;
OldPattern – "старая" подстрока;
NewPattern – "новая" подстрока;
Flags – переменная, задаваемая в квадратных скобках следующие
значения множества:
rfReplaceAll – заменяет все вхождения;
rfIgnoreCase – игнорирует регистр при поиске.
Например,
StringReplace('Блогер Ломает слоги', 'ло', 'ени', [])
выведет 'Бенигер Ломает слоги';
StringReplace('Блогер Ломает слоги', 'ло', 'ени',
[rfReplaceAll]) выведет 'Бенигер Ломает сениги';
StringReplace('Блогер Ломает слоги', 'ло', 'ени',
[rfReplaceAll, rfIgnoreCase]) выведет
'Бенигер енимает сениги';
StringReplace('Блогер Ломает слоги', 'ло', 'еНи',
[rfReplaceAll, rfIgnoreCase]) выведет
'БеНигер еНимает сеНиги'.
Примечание. Последние примеры показывают, что фраза
не зависит от регистра переменной NewPattern . Поэтому мы пишем свою
собственную функцию:
function StringReplaceNew(s, OldPattern, NewPattern: string; RegOld, RegNew: boolean): string;
var str, patt, sc, np: string;
len, p: integer;
begin
if RegOld then
begin
str:=s;
patt:=OldPattern;
end else
begin
str:=AnsiLowerCase(s);
patt:=AnsiLowerCase(OldPattern);
end;
Result:='';
len:=Length(OldPattern);
while str<>'' do
begin
p:=Pos(patt, str);
if p=0 then
begin
Result:=Result+s;
Break;
end;
Result:=Result+Copy(s, 1, p-1);
sc:=Copy(s, p, len);
np:=NewPattern;
if not RegNew then
if RegOld then
begin
if RegistrStringUpper(sc) and RegistrStringUpper(OldPattern) then
np:=AnsiUpperCase(NewPattern);
if not RegistrStringUpper(sc) and not RegistrStringUpper(OldPattern) then
np:=AnsiLowerCase(NewPattern);
end else
begin
if RegistrStringUpper(sc) then
np:=AnsiUpperCase(NewPattern) else
np:=AnsiLowerCase(NewPattern);
end;
Result:=Result+np;
s:=Copy(s, p+len, Length(s));
str:=Copy(str, p+len, Length(str));
end;
end;
где:
s – исходная строка;
OldPattern – "старая" подстрока;
NewPattern – "новая" подстрока;
RegOld – соблюдение регистра "старой" подстроки;
RegNew – соблюдение регистра "новой" подстроки.
Например,
StringReplaceNew('Блогер Ломает слоги', 'ло', 'еНи',
false, false выведет 'Бенигер ЕНИмает сениги';
StringReplaceNew('Блогер Ломает слоги', 'ло', 'еНи',
false, true) выведет 'БеНигер еНимает сеНиги';
StringReplaceNew('Блогер Ломает слоги', 'ло', 'еНи',
true, false) выведет 'Бенигер Ломает сениги';
StringReplaceNew('Блогер Ломает слоги', 'ло', 'еНи',
true, true) выведет 'БеНигер Ломает сеНиги';
StringReplaceNew('Программист', 'М', 'Н',
false, true) выведет 'ПрограННист';
StringReplaceNew('барабАн', 'ба', 'ле',
true, false) выведет 'лерабАн';
StringReplaceNew('Информатика', 'и', 'Е',
true, false) выведет 'Информатека'.
Как видно из примеров, удобнее работать с одиночными символами.
Примечание. Для полноценной работы данной функции
необходимо скопировать вспомогательные функции из раздела
"Операции с регистрами":
function RegistrCharUpper(c: char): boolean;
function RegistrStringUpper(s: string): boolean;
|