Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2002.11.11;
Скачать: [xml.tar.bz2];

Вниз

Поиск по шаблону   Найти похожие ветки 

 
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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.45 MB
Время: 0.008 c
6-34153
Oleg_Gashev
2002-09-11 23:56
2002.11.11
beginthread & socket


14-34179
dimonf
2002-10-21 17:46
2002.11.11
Можно ли экзешник перекомпилить в дельфи исходник?


4-34303
Azzazzin
2002-10-02 15:09
2002.11.11
Очень нужна помощь! RegisterClass & CreateWindow.


3-33863
Kislyak
2002-10-21 09:41
2002.11.11
кнопка не работает


1-33974
bobby
2002-11-01 14:36
2002.11.11
проблема





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