![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
класс TStringList [D5, XP]
v_o_v_a © (2006-09-08 14:54:00)Здрасте. У класса TStringList есть метод Find. Можно както организовать поиск строки, если она извесна не полностью (предположим только начало или конец). Спасибо.
umbra (2006-09-08 18:24:00) [1]да лучше в процедуру вообще строку (
src.Text) передавать :), но надо ж это было к стринглисту привязять.
default (2006-09-08 17:49:00) [2]umbra © (08.09.06 17:01) [8]
в код не вникал
но, вначале s := src.Text; сделать обязан:)
а то очень непроизводительно каждый раз Text запрашивать
umbra (2006-09-08 17:01:00) [3]эх, позориться, так позориться :)
это точно работает!
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;
umbra (2006-09-08 16:46:00) [4]дубль третий :)
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 16:23:00) [5]таки есть опечатки :)
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 15:51:00) [6]вот, например, процедура, возвращающая в параметре
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;
han_malign (2006-09-08 15:20:00) [7]
> второй параметр (Index) он указывает на позицию предшествующую наиболее подходящему слову.
Strings[Index - 1] < searchStr <= Strings[Index]
check (Index > 0) check (Index < Count)
Наиль (2006-09-08 15:13:00) [8]Только для начала строки.
Но перед этим список должен быть отсортирован.
CaseSensitive определяет учитывать ли регистр.
Если Find=true значит полное совпадение. Если нет, то смотри второй параметр (Index) он указывает на позицию предшествующую наиболее подходящему слову.
v_o_v_a (2006-09-08 15:12:00) [9]Жаль, что нельзя. спасибо
Dmitrij_K (2006-09-08 15:05:00) [10]Методом Find - нет.
Можно самому перебирать все строки и сравнивать по условию или
масками Masks.pas
или регулярным выражением TRegExpr