Работаем со строками        

Written by Douglas Tietjen - http://www.delphipages.com  Jun 10, 2000

Перевод Руденко Е.В.   janerev@hotmale.ru    январь 2001 года

Эта статья поможет тем, кто пытается манипулировать строками.  Приведенные ниже примеры просты, но показывают возможные пути решения ваших задач.

Допустим, нам надо заменить все пробелы в строке каким-то другим символом.  

Мы можем использовать:

StringReplace(Edit1.Text, ' ', '', [rfReplaceAll]);

Эта функция просматривает всю строку, введенную в  Edit1.Text и убирает (заменяет "ничем") все пробелы. Данная функция

присутствует в версиях DELPHI 4 и выше, а для использования в ранних версиях ниже приведен код.

function StringReplace(const S, OldPattern, NewPattern: string;
 Flags: TReplaceFlags): string;
var
 SearchStr, Patt, NewStr: string;
 Offset: Integer;
begin
 if rfIgnoreCase in Flags then
 begin
   SearchStr := AnsiUpperCase(S);
   Patt := AnsiUpperCase(OldPattern);
 end else
 begin
   SearchStr := S;
   Patt := OldPattern;
 end;
 NewStr := S;
 Result := '';
 while SearchStr <> '' do
 begin
   Offset := AnsiPos(Patt, SearchStr);
   if Offset = 0 then
   begin
     Result := Result + NewStr;
     Break;
   end;
   Result := Result + Copy(NewStr, 1, Offset - 1) + NewPattern;
   NewStr := Copy(NewStr, Offset + Length(OldPattern), MaxInt);
   if not (rfReplaceAll in Flags) then
   begin
     Result := Result + NewStr;
     Break;
   end;
   SearchStr := Copy(SearchStr, Offset + Length(Patt), MaxInt);
 end;
end;

Иногда бывает нужно использовать отдельные части строки, например конец E-Mail адреса.

Для примера давайте выделим первую часть адреса :  support@delphipages.com.

Будем использовать функцию  Copy для копирования нужной части строки и функцию Pos для нахождения позиции появления амперсанда (@) в заданной строке текста:

Edit2.text := Copy(Edit1.Text, 1, Pos('@', Edit1.Text)-1);

Если мы хотим выделить последнюю часть адреса, то делаем следующее:

Edit2.text := Copy(Edit1.Text, Pos('@', Edit1.Text)+1, Length(Edit1.Text)-Pos('@', Edit1.Text));

Это просто, но что будет , если используется, например, такая строка:

10,10,100,45,T,support@delphipages.com,80,douglas,tietjen

Можно конечно использовать последовательность функций  Copy, Pos и Delete , чтобы все-таки получить email адрес, но это совсем не простой способ решения наших проблем.

Во первых , я написал функцию  ListGetAt.

function TForm1.ListGetAt(List:String; Position:Integer; Delimiter:String): String;
var
   i, NP: integer;
begin
   NP := 0;
   for i := 1 to Position do begin
       List := Copy(List,NP,Length(List)-NP+1);
       NP := Pos(Delimiter,List)+1;
       if i = Position then begin
           if Pos(Delimiter, List) = 0 then break;
           Delete(List, NP-1, Length(List)-(NP-2));
       end;
   end;
   Result := List;
end;

Теперь, в любое время, когда мне необходимо получить  кусочек кода, я с легкостью могу это сделать, вызвав эту функцию.  Например, теперь если я хочу выделить  email адрес из строки , я могу написать следующее:

Edit2.Text := ListGetAt(Edit1.Text, 6, ',');

Результат :  'support@delphipages.com'.

Если мне надо выделить последнюю часть  email адреса, я делаю так :

Edit2.Text := ListGetAt(ListGetAt(Edit1.Text, 6, ','), 2, '@');

Теперь предположим, что лист текстовых строк содержит строки, которые вы хотите изменить и сохранить их для дальнейшего использования.  Снова будет слишком трудно пройти через все строки, найти нужную часть и обновить ее. Поэтому я написал другую функцию  ListSetAt.

function TForm1.ListSetAt(List:String; Position:Integer; Value:String; Delimiter:String): String;
var
   i, NP: integer;
   BegStr, EndStr: string;
begin
   NP := 0;
   BegStr := '';
   EndStr := '';
   for i := 1 to Position do begin
       if i > 1 then
       BegStr := BegStr+Copy(List, 0, Pos(Delimiter,List));
       List := Copy(List,NP,Length(List)-NP+1);
       NP := Pos(Delimiter,List)+1;
       if i = Position then begin
           if Pos(Delimiter, List) = 0 then break;
           EndStr := Copy(List, NP-1, Length(List)-(NP-2));
       end;
   end;
   Result := BegStr+Value+EndStr;
end;

Теперь, если я хочу изменить email адрес, то использую следующий код :

Edit1.Text := ListSetAt(Edit1.Text, 6, 'email@email.com', ',');

В данном случае будет изменена строка в 6-й позиции листа.  Чтобы получить часть строки после амперсанда использую:

ListGetAt(Edit1.Text, 2, '@');

В результате получаем : delphipages.com,80,douglas,tietjen

Эти функции просты, например, если в функцию ListGetAt подставить Position = 0  , то результатом будет вся строка.  Если подставить Position = 20, то результатом будет последняя строка в листе.  В наборе компонентов Cold Fusion есть команда, называемая  ListLen, так что вы можете определить число строк в листе, с которыми можно манипулировать.


function TForm1.ListLen(List: String; Delimiter: Char): Integer;
begin
   Result := 1;
   While Pos(Delimiter, List) > 0 do begin
       Delete(List, 1, Pos(Delimiter, List));
       Result := Result + 1;
   end;
end;


Надеюсь , эта статья поможет работающим со строками с разделителями

Возврат в список переводов

.