Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Универсальная функция поиска по маске


Vigi ©   (2011-05-19 14:28:00) 

Здрасти!
Что то не могу сообразить нужно сделать универсальную функцию поиска в тексте по маске!
текст (массив) будет иметь только числовые значения.

пример:
маска 'aabbb'   = 77333 = 44111 и тд.
маска 'aaxbb'   = 22033 = 99733 = 11422 и тд.
маска 'ababab' = 121212 = 414141 и тд.
маска 'xxxbb'  =  12377 = 10344 = 75622 ..

Есть мысли ? или уже есть готовое решение и не нужно выдумывать велосипед ?!


Vigi   (2011-05-19 15:37:00) [1]


> if MatchesSmartMask('abxba', IntToStr(i)) then      Memo1.
> Lines.Add(IntToStr(i));


Польшое спс все работает !!!!


Медвежонок Пятачок   (2011-05-19 15:17:00) [2]

маска 'aabbb'  => '(\d)\1{1}(\d)\2{2}'
маска 'aaxbb'  => '(\d)\1{1}\d(\d)\2{2}'

плюс исключить случаи :

aaaaa
и
aaabb
aabbb
aaaaa


MBo   (2011-05-19 14:58:00) [3]


 function MatchesSmartMask(Mask, Value: string): Boolean;
 var
   i: Integer;
   Map: array[Char] of Char;
   ReverseMap: array['0'..'9'] of Char;
 begin
   Result := False;
   if Length(Mask) <> Length(Value) then
     Exit;
   FillChar(Map, SizeOf(Map), 0);
   FillChar(ReverseMap, SizeOf(ReverseMap), 0);
   for i := 1 to Length(Mask) do
     if Mask[i] <> 'x' then
       if Map[Mask[i]] = #0 then begin
         if ReverseMap[Value[i]] = #0 then begin
           Map[Mask[i]] := Value[i];
           ReverseMap[Value[i]] := Mask[i];
         end
         else if ReverseMap[Value[i]] = Mask[i] then begin
         end
         else
           Exit;
       end
       else if Map[Mask[i]] <> Value[i] then
         Exit;
   Result := True;
 end;

var
 i: Integer;
begin
 for i := 10000 to 20000 do
   if MatchesSmartMask('abxba', IntToStr(i)) then
     Memo1.Lines.Add(IntToStr(i));


DVM   (2011-05-19 14:45:00) [4]


> Есть мысли ? или уже есть готовое решение и не нужно выдумывать
> велосипед ?!

http://regexpstudio.com/TRegExpr/TRegExpr.html


Наверх

Титульная страница Поиск, карта сайта Написать письмо