Небольшой модуль для работы со строками

Previous  Top  Next

    
 

Code:

{ **** UBPFD *********** by delphibase.endimus.com ****

>> Небольшой модуль для работы со строками

 

function CompMask(S, Mask: string):string; //выбор строки по маске

// удаление из строки count символов начиная с posit

function deleteStr(s:string;posit,count:integer):string;

//Удаление из строки s сначала first и с конца last символов

function deleteFaskaStr(s:string; first,last:integer):string;

Запись в стринлист strg всех вхождений по маске mask из строки source

procedure getStrings(var strg: TStringList; mask,source: string);

 

Зависимости: classes,sysutils

Автор:       SuMaga, sumaga@mail.ru, ICQ:721602488, Махачкала

Copyright:   Сам состряпал :)

Дата:        24 января 2003 г.

***************************************************** }

 

unit StrMask;

interface

uses classes, sysutils;

function CompMask(S, Mask: string): string;

function deleteStr(s: string; posit, count: integer): string;

function deleteFaskaStr(s: string; first, last: integer): string;

procedure getStrings(var strg: TStringList; mask, source: string);

 

implementation

 

type

TmaskObj = class

   constructor open;

public

   Maschr: tstringlist;

   Masposish: TStringList;

   destructor close;

end;

 

procedure getStrings(var strg: TStringList; mask, source: string);

var

s, s2: string;

begin

s2 := source;

s := CompMask(s2, mask);

while s <> '' do

begin

   strg.Add(s);

   s2 := StringReplace(s2, s, '', []);

   s := CompMask(s2, mask);

   if pos(s, s2) = 0 then

     break;

end;

 

end;

 

function eraseMask(inpstr: TStrings): TStrings;

var

i: integer;

e: boolean;

begin

e := false;

for i := 0 to inpstr.Count - 1 do

   if (i <> inpstr.Count - 1) and (i < inpstr.Count - 1) then

     if ((inpstr[i] = '`') and (inpstr[i + 1] = '|')) or

       ((inpstr[i] = '|') and (inpstr[i + 1] = '`')) or

       ((inpstr[i] = '`') and (inpstr[i + 1] = '`')) then

     begin

       e := true;

     end;

 

if (e = false) or (i <= inpstr.Count - 1) then

begin

   Result := inpstr;

   exit;

end;

 

for i := 0 to inpstr.Count - 1 do

   if (i <> inpstr.Count - 1) and (i < inpstr.Count - 1) then

     if ((inpstr[i] = '`') and (inpstr[i + 1] = '|')) or

       ((inpstr[i] = '`') and (inpstr[i + 1] = '`')) or

       ((inpstr[i] = '|') and (inpstr[i + 1] = '`')) then

     begin

       inpstr.Delete(i + 1);

       inpstr[i] := '`';

     end;

Result := eraseMask(inpstr);

end;

 

{

`<---- Эквивалентна----->*

|<---- Эквивалентна----->?

}

 

function SplitMask(mask: string; MaskList: TStringList): TStringList;

var

i, j, k: integer;

s1: string;

mch: TmaskObj;

begin

mch := TmaskObj.open;

for i := 1 to length(Mask) do

begin

   if Mask[i] = '`' then

   begin

     mch.Maschr.Add('`');

     mch.Masposish.Add(inttostr(i))

   end;

 

   if Mask[i] = '|' then

   begin

     mch.Maschr.Add('|');

     mch.Masposish.Add(inttostr(i))

   end;

end;

k := 0;

for i := 0 to mch.Maschr.Count - 1 do

begin

   j := strtoint(mch.Masposish.Strings[i]) - k;

   if j - 1 <> 0 then

     s1 := copy(Mask, 1, j - 1)

   else

     s1 := '';

   delete(Mask, 1, j);

   k := length(s1) + 1 + k;

   if (s1 <> mch.Maschr.Strings[i]) and (length(s1) <> 0) then

     MaskList.Add(s1);

   MaskList.Add(mch.Maschr.Strings[i]);

end;

if Mask <> '' then

   MaskList.Add(Mask);

mch.close;

Result := TStringList(eraseMask(MaskList));

end;

 

function deleteStr(s: string; posit, count: integer): string;

begin

Delete(s, posit, count);

Result := s;

end;

 

function deleteFaskaStr(s: string; first, last: integer): string;

begin

result := deleteStr(s, 1, first);

result := deleteStr(Result, length(Result) - last + 1, length(Result) -

   (length(Result) - last));

end;

 

function CompMask(S, Mask: string): string;

var

i, j, k, y: integer;

s1, s2, s3, s4, s5: string;

MaskList: TStringList;

PrPos: integer;

var

fm: boolean;

label

1, 2, 3;

 

begin

2:

if length(s) = 0 then

   exit;

if length(Mask) = 0 then

   exit;

if length(s) < length(Mask) then

   exit;

//if Assigned(MaskList) then

begin

   MaskList := TStringList.Create;

   MaskList := SplitMask(Mask, MaskList);

end;

PrPos := 0;

s4 := s;

fm := false;

s3 := '';

i := 0;

result := '';

if MaskList.Count - 1 = 0 then

begin

   if (MaskList[0] = '`') then

   begin

 

     s3 := s;

     fm := true;

   end;

   if (MaskList[0] = '|') then

   begin

     s3 := s[1];

     fm := true;

     result := s3;

     exit;

   end;

   if (MaskList[0] <> '`') and (MaskList[0] <> '|') then

   begin

     if pos(MaskList[0], s) = 0 then

       exit;

     s3 := copy(s, pos(MaskList[0], s), length(MaskList[0]));

     fm := true;

   end;

   i := MaskList.Count + 1;

end;

 

//Начало цикла

while i <= MaskList.Count - 1 do

begin

   if (MaskList[i] = '`') and (PrPos = 0) and (i + 1 <= MaskList.Count - 1)

     then

   begin

     if pos(MaskList[i + 1], s) = 0 then

       goto 2;

     j := pos(MaskList[i + 1], s) + length(MaskList[i + 1]) - 1;

     s3 := copy(s, 1, j);

     delete(s, 1, j);

     fm := true;

     PrPos := j;

     i := i + 1;

     goto 1;

   end;

 

   if (MaskList[i] = '|') and (PrPos = 0) and (i + 1 <= MaskList.Count - 1)

     then

   begin

     k := i;

     y := 0;

     if i + 1 <= MaskList.Count - 1 then

       while (MaskList[k] = '|') do

       begin

         k := k + 1;

         y := y + 1;

         if k >= MaskList.Count - 1 then

           break;

       end;

     if pos(MaskList[k], s) = 0 then

       goto 2;

     j := pos(MaskList[k], s);

     s3 := copy(s, j - y, length(MaskList[k]) + y);

     delete(s, 1, j + length(MaskList[k]) - 1);

     fm := true;

     PrPos := j - 1;

     i := k;

     goto 1;

   end;

   if (PrPos = 0) and (MaskList[i] <> '|') and (MaskList[i] <> '`') then

   begin

     if pos(MaskList[i], s) = 0 then

       break;

     j := pos(MaskList[i], s);

     s3 := copy(s, j, length(MaskList[i]));

     delete(s, 1, j + length(MaskList[i]) - 1);

     fm := true;

     PrPos := length(MaskList[i]);

     goto 1;

   end;

 

   fm := false;

   if (PrPos <> 0) and (i < MaskList.Count - 1) then

   begin

     if (MaskList[i] = '`') then

     begin

       if pos(MaskList[i + 1], s) = 0 then

         goto 2;

       j := pos(MaskList[i + 1], s);

       s3 := s3 + copy(s, 1, j + length(MaskList[i + 1]) - 1);

       fm := true;

 

       delete(s, 1, j + length(MaskList[i + 1]) - 1);

 

       PrPos := j + length(MaskList[i + 1]);

       i := i + 1;

       goto 1;

 

     end;

     if (MaskList[i] = '|') then

     begin

       if i + 1 <= MaskList.Count - 1 then

         if MaskList[i + 1] <> '|' then

         begin

           if pos(MaskList[i + 1], s) > 2 then

           begin

             //break;

             goto 2;

           end;

           s3 := s3 + copy(s, 1, length(MaskList[i + 1]) + 1);

           delete(s, 1, length(MaskList[i + 1]) + 1);

           fm := true;

           i := i + 1;

           goto 1;

         end;

       s3 := s3 + copy(s, 1, 1);

       delete(s, 1, 1);

       fm := true;

       PrPos := 1;

     end;

 

     if (MaskList[i] <> '`') and (MaskList[i] <> '|') then

     begin

       if pos(MaskList[i], s) = 0 then

         goto 2;

       j := pos(MaskList[i], s);

       s3 := s3 + copy(s, j, length(MaskList[i]));

       delete(s, 1, j + length(MaskList[i]) - 1);

       fm := true;

       PrPos := length(MaskList[i]);

       fm := true

     end;

   end;

 

   if (PrPos <> 0) and (i = MaskList.Count - 1) then

   begin

     if (MaskList[i] = '`') then

     begin

       s3 := s3 + s;

       s := '';

       fm := true;

       PrPos := j;

     end;

     if (MaskList[i] = '|') then

     begin

       s3 := s3 + copy(s, 1, 1);

       delete(s, 1, 1);

       fm := true;

       PrPos := 1;

     end;

     if (MaskList[i] <> '`') and (MaskList[i] <> '|') then

     begin

       if pos(MaskList[i], s) <> 0 then

         j := pos(MaskList[i], s) + length(MaskList[i]) - 1

       else

         goto 2;

       s3 := s3 + copy(s, 1, j);

       delete(s, 1, j);

       fm := true;

       PrPos := j + length(s3);

     end;

   end;

   1: inc(i);

end;

s5 := s3;

if s3 <> '' then

   for i := 0 to MaskList.Count - 1 do

     if (MaskList[i] <> '`') and (MaskList[i] <> '|') then

     begin

       if pos(MaskList[i], s3) = 0 then

         goto 2;

       s3 := StringReplace(s3, MaskList[i], '', []);

     end;

 

s3 := s5;

MaskList.Free;

 

if fm then

begin

   result := s3;

end

   {

   {result:='';

   else

   if length(s)>=length(Mask) then

   result:=CompMask(s,Mask)

   else Result:='';}

end;

 

destructor TmaskObj.close;

begin

Maschr.free;

Masposish.free;

end;

 

constructor TmaskObj.open;

begin

Maschr := TStringList.Create;

Masposish := TStringList.Create;

end;

end.

Пример использования:

 

s := 'asd r';

s := CompMask(s, 'd |');

//в результате s='d r';

©Drkb::00854