Главная страница
    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.008 c
14-34188
lipskiy
2002-10-17 20:51
2002.11.11
Посоветуйте фантастику


14-34205
vopros
2002-10-21 10:31
2002.11.11
Вы будете смеяться, но Ира меня покинула.


4-34313
Yus
2002-10-03 05:43
2002.11.11
Игровой порт


14-34192
Юрий Зотов
2002-10-21 18:17
2002.11.11
Поиск книги


1-34121
VladP
2002-10-29 17:17
2002.11.11
не сохраняются SubProperties элементов коллекции





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