![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Универсальная функция поиска по маске
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