Форум: "Основная";
Текущий архив: 2004.05.02;
Скачать: [xml.tar.bz2];
ВнизСравнение по маске Найти похожие ветки
← →
Pirate © (2004-04-16 09:11) [0]Есть некая маска (Как в поиске windows) состоящая из:
*-неизвестное кол-во неизвестных символов,
?-1 неизвестный сомвол,
#-одна неизвестная цифра,
и некоторого текста.
Чтото вроде "*вася##фарева?"
и есть ещё строчка- вроде "йцукен(вася45фарева)".
Нужно проверить релевантность строчки к маске.
rel("qwerty*","*rt?")=true
rel("qwery*","*rt?")=false
сколко мучался- не смог.
Может есть аналог функции? Например в бейсике-
function like(s1,s2:string);
← →
Anatoly Podgoretsky © (2004-04-16 09:26) [1]MatchesMask
← →
Alx2 © (2004-04-16 10:28) [2]>Pirate © (16.04.04 09:11)
Накидал что-то.
Но еще много работы по оптимизации. И особо не тестировал.
Интересно узнать, работает ли она? :))
Function MathesMask(Const Mask, Sample: String): Boolean;
Var
LenMask, LenSample: Integer;
Function Like(idx, idxSample: Integer): Boolean;
Function AnySymbol: Boolean;
Begin
Result := True;
End;
Function AnyDigit: Boolean;
Begin
Result := Sample[idxSample] In ["0".."9"];
End;
Begin
Result := (idx > LenMask) And (idxSample > LenSample);
If Not result Then
Begin
Result := (idxSample <= LenSample) And (idx <= LenMask);
If Result Then
Case Mask[idx] Of
"*":
Result := (Idx = LenMask) Or
Like(idx + 1, idxSample + 1) Or
((idxSample < LenSample) And Like(idx, idxSample + 1));
"?": Result := AnySymbol And Like(idx + 1, idxSample + 1);
"#": Result := AnyDigit And Like(idx + 1, idxSample + 1);
Else
Result := (Mask[idx] = Sample[idxSample]) And Like(idx + 1, idxSample + 1);
End;
End;
End;
Begin
LenMask := Length(mask);
LenSample := Length(Sample);
Result := (Mask <> "") And Like(1, 1);
End;
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2004.05.02;
Скачать: [xml.tar.bz2];
Память: 0.45 MB
Время: 0.036 c