Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2006.10.01;
Скачать: [xml.tar.bz2];

Вниз

класс 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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.47 MB
Время: 0.012 c
2-1157709922
Urvin
2006-09-08 14:05
2006.10.01
Отправить запрос на сервер


3-1154073427
RomanH
2006-07-28 11:57
2006.10.01
Тривиальный SQL-запрос


2-1158251162
Niko
2006-09-14 20:26
2006.10.01
Как определить номер элемента


2-1157703974
P2P
2006-09-08 12:26
2006.10.01
Помогите перевести конструкцию с C++


2-1158147823
VitV
2006-09-13 15:43
2006.10.01
FastReport-запрос в отчёте





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский