Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
1-83601
Alexno
2003-05-14 15:05
2003.05.26
потоки


7-83783
Жук
2003-03-19 10:39
2003.05.26
Имя компьютера


14-83658
GOOD
2003-05-03 03:58
2003.05.26
ВНИМАНИЕ!! НЕ ВЕРЬТЕ РЕФИРАЛАМ НЕ поддавайтесь обману! ВНИМАНИЕ!!


1-83547
zeratul_pr
2003-05-13 22:28
2003.05.26
Список файлов в memo...


1-83574
From_X
2003-05-14 11:38
2003.05.26
Выделение строк в Grid-e





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский