Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.10.01;
Скачать: CL | DM;

Вниз

класс TStringList   Найти похожие ветки 

 
v_o_v_a   (2006-09-08 14:54) [0]

Здрасте. У класса TStringList есть метод Find. Можно както организовать поиск строки, если она извесна не полностью (предположим только начало или конец). Спасибо.


 
Dmitrij_K   (2006-09-08 15:05) [1]

Методом Find - нет.
Можно самому перебирать все строки и сравнивать по условию или
масками Masks.pas
или регулярным выражением TRegExpr


 
v_o_v_a   (2006-09-08 15:12) [2]

Жаль, что нельзя. спасибо


 
Наиль ©   (2006-09-08 15:13) [3]

Только для начала строки.
Но перед этим список должен быть отсортирован.
CaseSensitive определяет учитывать ли регистр.
Если Find=true значит полное совпадение. Если нет, то смотри второй параметр (Index) он указывает на позицию предшествующую наиболее подходящему слову.


 
han_malign ©   (2006-09-08 15:20) [4]


> второй параметр (Index) он указывает на позицию предшествующую наиболее подходящему слову.

Strings[Index - 1] < searchStr <= Strings[Index]
check (Index > 0)                      check (Index < Count)


 
umbra ©   (2006-09-08 15:51) [5]

вот, например, процедура, возвращающая в параметре Indices индексы элементов стринглиста, в которых есть подстрока. Длина этого массива равна количеству таких элементов. Процедура не ищет пустых строк, но это поправимо. Не тестировал, возможны опечатки :)

type
 TIntArray: array of Integer;
{....................................................}
procedure FindPattern(pattern: string; src: TStringList; out Indices: TIntArray);
var
 matchpos, delimpos, counter: integer;
begin
 delimpos := 0;
 counter := 0;
 matchpos := PosEx(pattern, src.Text);
 if matchpos = 0 then exit;
 repeat
   SetLength(Indices, Length(Indices) + 1);
   Indices[High(Indices)] := -1
   repeat  
      Inc(Indices[High(Indices)]);
      delimpos := PosEx(ItemDelimiter, src.Text, delimpos);
   until  delimpos >= matchpos;
   matchpos := PosEx(pattern, src.Text, matchpos);
 Until matchpos = 0;
end;


 
umbra ©   (2006-09-08 16:23) [6]

таки есть опечатки :)

type
TIntArray: array of Integer;
{....................................................}
procedure FindPattern(pattern: string; src: TStringList; out Indices: TIntArray);
var
matchpos, delimpos, counter: integer;
begin
delimpos := 0;
counter := 0;
matchpos := PosEx(pattern, src.Text);
if matchpos = 0 then exit;
repeat
  SetLength(Indices, Length(Indices) + 1);
  Indices[High(Indices)] := -1
  repeat  
     Inc(Indices[High(Indices)]);
     delimpos := PosEx(#13#10, src.Text, delimpos);
  until  delimpos >= matchpos;
  matchpos := PosEx(pattern, src.Text, matchpos);
Until matchpos = 0;
end;


 
umbra ©   (2006-09-08 16:46) [7]

дубль третий :)

type
TIntArray: array of Integer;
{....................................................}
procedure FindPattern(pattern: string; src: TStringList; out Indices: TIntArray);
var
matchpos, delimpos, counter: integer;
begin
counter := 0;
matchpos := PosEx(pattern, src.Text);
if matchpos = 0 then exit;
repeat
 SetLength(Indices, Length(Indices) + 1);
 Indices[High(Indices)] := -1
 repeat
    delimpos := 0;  
    Inc(Indices[High(Indices)]);
    delimpos := PosEx(#13#10, src.Text, delimpos + 2);
 until  delimpos >= matchpos;
 matchpos := PosEx(pattern, src.Text, delimpos + 2);
Until matchpos = 0;
end;


 
umbra ©   (2006-09-08 17:01) [8]

эх, позориться, так позориться :)
это точно работает!

TIntArray = array of Integer;
{...............................................}
procedure FindPattern(pattern: string; src: TStrings; out Indices: TIntArray);
var
matchpos, delimpos, counter: integer;
begin
counter := 0;
matchpos := PosEx(pattern, src.Text);
if matchpos = 0 then exit;
repeat
SetLength(Indices, Length(Indices) + 1);
Indices[High(Indices)] := -1;
delimpos := 0;
repeat
   Inc(Indices[High(Indices)]);
   delimpos := PosEx(#13#10, src.Text, delimpos + 2);
until  delimpos >= matchpos;
matchpos := PosEx(pattern, src.Text, delimpos + 2);
Until matchpos = 0;
end;



 
default ©   (2006-09-08 17:49) [9]

umbra ©   (08.09.06 17:01) [8]
в код не вникал
но, вначале s := src.Text; сделать обязан:)
а то очень непроизводительно каждый раз Text запрашивать


 
umbra ©   (2006-09-08 18:24) [10]

да лучше в процедуру вообще строку (src.Text) передавать :), но надо ж это было к стринглисту привязять.



Страницы: 1 вся ветка

Текущий архив: 2006.10.01;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.03 c
1-1155711055
QuickFinder
2006-08-16 10:50
2006.10.01
Дату в 4 байта


6-1147016467
Windows
2006-05-07 19:41
2006.10.01
ICQ клиент на Win API


2-1157719417
arhis
2006-09-08 16:43
2006.10.01
Автоматическое закрыте формы


2-1158012528
DelphiN#1
2006-09-12 02:08
2006.10.01
MEmo


15-1157876075
kull
2006-09-10 12:14
2006.10.01
Какой браузер лучше?