![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Поиск текста [D6, WinXP]
НовиЧок © (2004-07-18 06:49:00)Уважаемые мастера!
Подскажите, пожалуйста, как можно профильтровать файл или Memo и выдрать от туда определённый текст? Например это сохранённый html файл в тексте которого есть IP адреса:
61.6.77.2
202.97.150.150
20.13.199.59
вот их и нужно от туда вынуть.
Рыба (2004-07-18 10:23:00) [1]
unit Search;
interface
uses WinProcs, SysUtils, StdCtrls, Dialogs;
const
WordDelimiters: set of Char = [ #0..#255] - ['a'..'z','A'..'Z','1'..'9','0'];
function SearchMemo(Memo: TCustomEdit; const SearchString: String; Options: TFindOptions): Boolean;
implementation
function SearchBuf(Buf: PChar; BufLen: Integer; SelStart, SelLength: Integer;
SearchString: String; Options: TFindOptions): PChar;
var C: Char;
Direction: Shortint;
SearchCount, I: Integer;
CharMap: array [Char] of Char;
function FindNextWordStart(var BufPtr: PChar) : Boolean;
begin { (True XOR N) is equivalent to (not N) }
while (SearchCount > 0) and
((Direction = 1) xor
(BufPtr^ in WordDelimiters)) do begin
Inc(BufPtr, Direction);
Dec(SearchCount);
end;
while (SearchCount > 0) and
((Direction = -1) xor
(BufPtr^ in WordDelimiters)) do begin
Inc(BufPtr, Direction);
Dec(SearchCount);
end;
Result := SearchCount > 0;
if Direction = -1 then begin {back up one char, to leave ptr on first non delim}
Dec(BufPtr, Direction);
Inc(SearchCount);
end;
end;
begin
Result := nil;
if BufLen <= 0 then Exit;
if frDown in Options then begin
Direction := 1;
Inc(SelStart, SelLength); { start search past end of selection }
SearchCount := BufLen - SelStart - Length(SearchString);
if SearchCount < 0 then Exit;
if Longint(SelStart) + SearchCount > BufLen then Exit; end
else begin
Direction := -1;
Dec(SelStart, Length(SearchString));
SearchCount := SelStart+1;
end;
if (SelStart < 0) or (SelStart > BufLen) then Exit;
Result := @Buf[SelStart];
for C := Low(CharMap) to High(CharMap) do CharMap[C] := C;
if not (frMatchCase in Options) then begin
AnsiUpperBuff(PChar(@CharMap), sizeof(CharMap));
AnsiUpperBuff(@SearchString[1], Length(SearchString));
end;
while SearchCount > 0 do begin
if frWholeWord in Options then begin
if not FindNextWordStart(Result) then Break;
end;
I := 0;
while (CharMap[Result[I]] = SearchString[I+1]) do begin
Inc(I);
if I >= Length(SearchString) then begin
if (not (frWholeWord in Options)) or
(SearchCount = 0) or
(Result[I] in WordDelimiters) then begin
Exit;
end;
Break;
end;
end;
Inc(Result, Direction);
Dec(SearchCount);
end;
Result := nil;
end;
function SearchMemo(Memo: TCustomEdit;
const SearchString: String;
Options: TFindOptions): Boolean;
var Buffer, P: PChar;
Size: Word;
begin
Result := False;
if Length(SearchString) = 0 then Exit;
Size := Memo.GetTextLen;
if Size = 0 then Exit;
Buffer := StrAlloc(Size + 1);
try
Memo.GetTextBuf(Buffer, Size + 1);
P := SearchBuf(Buffer, Size + 1, Memo.SelStart, Memo.SelLength,
SearchString, Options);
if P <> nil then begin
Memo.SelStart := P - Buffer;
Memo.SelLength := Length(SearchString);
Result := True;
end;
finally
StrDispose(Buffer);
end;
end;
end.
Anatoly Podgoretsky (2004-07-18 09:08:00) [2]TUser © (18.07.04 07:26) [2]
По всем 4 миллиардам адресов
TUser (2004-07-18 07:26:00) [3]pos, posex
GraY (2004-07-18 07:12:00) [4]напиши поиск в формате ххх.ххх.ххх.ххх
где х-0...9