Форум: "Основная";
Текущий архив: 2003.05.26;
Скачать: [xml.tar.bz2];
ВнизРабота с масками вида 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;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.007 c