Текущий архив: 2002.11.11;
Скачать: CL | DM;
ВнизПоиск по шаблону Найти похожие ветки
← →
Anakin (2002-10-31 00:46) [0]Требуется организовать поиск (например, имен файлов) по шаблону "?". Подскажите, пожалуйста, как лучше всего это сделать, если таких "?" в строке может быть сколько угодно.
← →
[NIKEL] (2002-10-31 00:56) [1]FindFirst("YYD?*.??DFF",faAnyFile,...) ... так неполучается?
← →
SottNick (2002-10-31 07:00) [2]в свое время написал функцию для проверки соответствия какой-либо строки заданной маске (маскам)
может кому пригодится
писал сам, оптимальность не обещаю, вообще, таких функций должно быть много написано
function IsInMask(S:string;Mask:string):boolean;
//Узнает, подходит ли строка (S) под маску (Mask)
//Формат маски:
// ? - любой символ или его отсутствие
// | - любой символ
// * - любые символы или их отсутствие
// , - разделитель масок (подходит ли хоть под одну)
// остальные символы (включая пробел) - значащие символы строки
//------ (с) SottNick ------
var
pm:integer;
s1:string;
function probe(S:string;Mask:string):boolean;
var
ps,pm,lm:integer;
function freeLengthMask(S:string):integer;
var
ps:integer;
begin
ps:=1;
while ps<=length(S) do
if S[ps] in ["?","*"]
then
delete(S,ps,1)
else
inc(ps);
Result:=length(S);
end;
begin
lm:=length(Mask);
pm:=1;
while (pm<=lm)and not(Mask[pm] in ["?","|","*"]) do
inc(pm);
if pm>lm
then
Result:=S=Mask
else
begin
Result:=false;
if copy(S,1,pm-1)=copy(Mask,1,pm-1)
then
begin
delete(S,1,pm-1);
delete(Mask,1,pm-1);
case Mask[1] of
"|":
begin
pm:=1;
while Mask[pm+1]="|" do
inc(pm);
if length(S)>=pm
then
Result:=probe(copy(S,pm+1,length(S)-pm),copy(Mask,pm+1,length(Mask)-pm));
end;
"?":
begin
pm:=1;
while Mask[pm+1]="?" do
inc(pm);
delete(Mask,1,pm);
for ps:=1 to pm+1 do
begin
Result:=probe(copy(S,ps,length(S)-ps+1),Mask);
if Result
then
break;
end;
end;
"*":
begin
pm:=1;
while Mask[pm+1]="*" do
inc(pm);
delete(Mask,1,pm);
pm:=length(S)-freeLengthMask(Mask)+1;
for ps:=1 to pm+1 do
begin
Result:=probe(copy(S,ps,length(S)-ps+1),Mask);
if Result
then
break;
end;
end;
end;
end;
end;
end;
begin
Result:=false;
pm:=pos(",",Mask);
while pm<>0 do
begin
s1:=copy(Mask,1,pm-1);
Mask:=copy(Mask,pm+1,length(Mask)-pm);
if length(s1)>0
then
begin
Result:=probe(S+"1",s1+"1");
if Result
then
break;
end;
pm:=pos(",",Mask);
end;
if not Result and (length(Mask)>0)
then
Result:=probe(S+"1",Mask+"1");
end;
Страницы: 1 вся ветка
Текущий архив: 2002.11.11;
Скачать: CL | DM;
Память: 0.45 MB
Время: 0.008 c