Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.05.26;
Скачать: CL | DM;

Вниз

Работа с масками вида xyz* ну или что-то подобное   Найти похожие ветки 

 
NewBegginer   (2003-05-12 20:44) [0]

Здравствуйте Мастера!
Помогите пожалуиста вот в таком деле, а то сам не могу придумать как сделать.
Есть текстовый файл примерно такого формата
12345678
87654321
........
12387654
т.е. в нем только целые числа
надо в этом файле проверить каждую строку на соответствие определённой маске.

С помощью maskmatches можно проверить только маски вида
"*?какой-нибудь символ"
а мне надо чтобы наравне с такой маской проверялась и вот такая
"xxyyzz" где x,y,z какие-нибудь числа, то есть под эту маску должны к примеру подойти числа 112233, 551199, 772266 и тд.
Притом вместо x,y,z могут быть любые буквы, но когда в такой маске будет число, то проверятся будет именно на это число, а не как в случае с буквой.
То есть к маске "1xxyyzz1" подойдут 12233441, 16611881, но не 25566992.
Подскажите пожалуйста как это сделать, просто нигде не могу найти решение.


 
Song ©   (2003-05-12 21:29) [1]

Ну так вручную парсингом.


 
NewBegginer   (2003-05-12 21:36) [2]

Song
А по конкретнее


 
Романов Р.В. ©   (2003-05-12 22:17) [3]

Для решения задачи в такой постановке вполне подойдет примерно такая функция

function IntMask(const Str, Mask: String): Boolean;
var
L, i: Integer;
begin
Result := False;
L := Length(Str);
if L <> Length(Mask) then Exit;
for i := 1 to L do
begin
if (Mask[i] in ["0".."9"]) and (Mask[i] <> Str[i]) then Exit
else
begin
if not ((i = 1) or
((Mask[i] <> Mask[i-1]) and (Str[i] <> Str[i-1])) or
((Mask[i] = Mask[i-1]) and (Str[i] = Str[i-1]))) then Exit;
end;
end;
Result := True;
end;

А для работы с такими масками "1yyxxyy1" нужно что то посложнее


 
NewBegginer   (2003-05-12 22:44) [4]

Романов Р.В.
А вы уверены что подойдёт? Я нет.
Маска "xxyyzz" означает что на месте одинаковых букв должны стоять одинаковые цифры. А такая маска приведена лишь для примера. Маска может быть любой, "abccbc" или "zzzxcca" или "aazzzz*" и тд.
Какие есть ещё предложения?


 
Романов Р.В. ©   (2003-05-12 22:47) [5]

Конечно не подойдет.
Про звездочку ничего небыло сказано :)


 
NewBegginer   (2003-05-12 23:03) [6]

Романов Р.В.
Да не в звёздочке дело:((
Данная функция может проверять только маски "xxyy", а надо чтобы проверяла и "xyzyz" и тд.
Цитирую себя же:
Маска "xxyyzz" означает что на месте одинаковых букв должны стоять одинаковые цифры. А такая маска приведена лишь для примера. Маска может быть любой, "abccbc" или "zzzxcca" или "aazzzz*" и тд.
Так вот данная функция пролетает даже на маске "xyx", она считает что 123 к ней полходит.


 
Arch-vile ©   (2003-05-12 23:38) [7]

2NewBeginner
такую прогу за час можно написать. если, хочешь, скинь мне на мыло свой адрес, а я тебе потом отправлю решение. Счас не могу, иду дрыхнуть.


 
гончий   (2003-05-13 10:46) [8]

Лучше функций для парсинга, чем в модуле QStrings.pas я еще не видел. Там, кстати, есть и для работы с масками:
http://www.dbwork.kuban.ru/download/qstrings.zip


 
NewBegginer   (2003-05-13 21:10) [9]

Arch-vile
hell_2003@inbox.ru
был бы очень признателен.


 
Arch-vile ©   (2003-05-14 17:11) [10]

Решение немного опоздало из-за загруженности. Слшком много уроков задали :)
unit strmask;

interface

uses
SysUtils;

function IsMasking(mask, num:string):boolean;

implementation

function IsMasking(mask, num:string):boolean;
const
cifers=["0".."9"];
chars=["a".."j"]; {всего 10 цифр. потому и букв 10}
var
links: array[0..9] of char; {здесь будут храниться буквы, обозначающие определенные числа}
i: integer;
UsesChars:set of "a".."j";
begin
result:=false;
for i:=0 to 9 do links[i]:=" ";
if length(num)<>length(mask) then exit; {Если не совпадает длинна}
for i:=1 to length(mask) do begin {проходим маску от начала до конца}
if mask[i] in cifers then begin {если в маске - цифра..}
if num[i]=mask[i] then {и если в числе такая же цифра...}
continue else exit end;// else {продолжим обсчет, иначе выйдем}

if not (mask[i] in UsesChars) then begin {если буквы такой не было еще}
if links[StrToInt(num[i])]=" " then begin {и если эта цифра не занята}
UsesChars:=UsesChars+[mask[i]]; {используем букву}
links[StrToInt(num[i])]:=mask[i]; {вставим связь}
end else exit; {буквы не было, но эта цифра уже занята}
end else {буква уже была}
if not (links[StrToInt(num[i])]=mask[i]) then exit;
{если связи с этой буквой нет, выйдем, иначе дальше}
end; {все прошли, ура, победа}
result:=true;
end;

end.


 
Arch-vile ©   (2003-05-14 17:13) [11]

Ой, я ошибся, решение заняло не час. Оно заняло 40 минут :)


 
NewBegginer   (2003-05-15 05:14) [12]

Arch-vile
Не поверишь, но лёжа сегодня утром в ваной придумал тоже самое.
Даже на первую пару не пошёл чтобы проверить как это заработает.
Проверил мыло а тут и ты своё решение подогнал.
Большое спасибо за помошью



Страницы: 1 вся ветка

Текущий архив: 2003.05.26;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.011 c
3-83400
Солер
2003-05-06 16:59
2003.05.26
Как отменить запрос?


14-83661
Карлсон
2003-05-05 16:07
2003.05.26
Photoshop 6.0 Rus


14-83669
ikivio
2003-05-05 19:59
2003.05.26
Проблема с поиском файлов по тексту в WinXP


1-83591
alexy
2003-05-14 13:51
2003.05.26
как распечатать StringGrid7


14-83699
KIR
2003-05-05 12:59
2003.05.26
Событие OnCellClick компонента TDBGrid