Как реализовать фильтр по шаблону?
Например мне нужно отфильтровать всё подобное этому:
9678.596.45.1297
XXXX.XXX.XX.XXXX
X - цифра
Модератор: Модераторы
function EmptyParseTemplate(InputStr: String):boolean;
var
Numbers: set of '0'..'9';
i:integer;
flag:boolean;
begin
flag:=true;
Numbers:=['0'..'9'];
for i:=1 to Length(InputStr) do
begin
if (not (InputStr[i] in Numbers )) and (not (InputStr[i] = '.')) then flag:=false;
end;
result:=flag;
end;
function FirstTag (var Str:String):TTag;
Var
Start, Finish:boolean;
StrTag:String;
Begin
If Str='' then
begin
Result.Str:='';//отсев ошибочного использования
end else
begin
Start:=False; // инициализация переменных.
Finish:=False;
Result.Str:='';
Result.tags:=true;
StrTag:='';
while Finish=false do //
begin
if Str='' then
Begin
Finish:=True;//выход из цикла по исчерпанию строки. условия выхода могут быть любые
Result.tags:=false;
End else
Begin
StrTag:=Copy(Str,1,1);
case StrTag of
'<':
Begin
if Start=true then
Begin //это второй символ '<'
Finish:=True; // штатный выход если это все же не тег.
Result.tags:=false;
end else //это первый символ '<'.
begin // начинаем копировать предположительно тег в строку
if Result.Str='' then
begin
Start:=True;
Result.Str:=Result.Str+StrTag;
Delete(Str, 1, 1);
end else
begin // результат -- все, что до символа '<' НЕ тег
Finish:=True;
result.tags:=false;
end;
end
end;
'>':
Begin
Result.Str:=Result.Str+StrTag;
Delete(Str, 1, 1);
if Start=true then
begin
Finish:=True;// штатный выход если тег
result.tags:=true;
end else
begin
Finish:=True;// штатный выход если НЕ тег
result.tags:=false;
end;
end;
else Begin
Result.Str:=Result.Str+StrTag; // обычный символ
Delete (Str, 1, 1);
End;
end;
end;
end;
end;
end;
function TestTag (Str:TTag):Boolean;
Var
TempStr:string;
Begin
TempStr:=Copy(Str.Str,0,4);//больше 4 вряд ли потребуется
{
теги после которых строка переводится:
<bp> </h1 <h2 <h3 </p> </di </ta </tr </th </tb </li
во всех остальных случаях нет!}
//showMessage ('function TestTag -- TempStr='+TempStr);
case TempStr of
'<bp>', '</h1', '<h2', '<h3', '</p>', '</di', '</ta', '</tr', '</th', '</tb', '</li'
:begin
result:=true;
end;
Type
OnOff=boolean;
TTag=record
Str:String;
// verify:OnOff;
tags:boolean;
end;
Const
ValueOn=true;
ValueOff=False;
function EmptyParseTemplate(InputStr: String):boolean;
var
i:integer;
begin
for i:=1 to Length(InputStr) do
if not (InputStr[i] in ['.', '0'..'9']) then
exit(False);
Result:=true;
end;
alexs писал(а):Ваш пример узкозаточен. И тоже допускает оптимизацию.
AlphaBlend писал(а):а какой алгоритм можете посоветовать в случае задачи этого поста ?
for i := 0 to Pred(sList.Count) do
for k := 1 to Length(sList[i]) - 15 do
begin
Flag := true;
m := 0;
while Flag and (m < 16) do
begin
Ch := sList[i][k + m];
if (m = 4) or (m = 8) or (m = 11) then
Flag := Flag and (Ch = '.') else
Flag := Flag and (Ch in ['0'..'9']);
Inc(m);
end;
if Flag then sListOut.Append(Copy(sList[i], k, 16));
end;
AlphaBlend писал(а):можно после flag:=false; добавить break
Сейчас этот форум просматривают: Majestic-12 [Bot] и гости: 83