Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 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.007 c
6-34146
Yustaz
2002-09-13 21:10
2002.11.11
traffic


3-33877
irmantukas
2002-10-22 13:29
2002.11.11
Фильтр


4-34319
Yelchev
2002-09-30 11:50
2002.11.11
Перевод инсталированого фонта в векторную графику


7-34263
Keplin Sergey
2002-09-07 00:45
2002.11.11
создать несколько вложенных каталогов одной функцией!


4-34310
_sMile
2002-09-27 15:53
2002.11.11
Ресурсы и WinAPI





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский