Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 28.08.2012, 16:44   #1
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию Регулярные выражения. Правильность составления

Всем доброго.
Есть задача с помошью регулярных выражений определить пригоден ли файл (определяется по его имени) к некоей задаче.
Допустим есть файлы:
d123456789.dbf..DBF
d123456789.dbf

Первый файл не пригоден - у него испорчено расширение, второй годится.
Проверяю так:
Код:
TRegEx.IsMatch('d123456789.dbf','^d12(\d{7})(!$.dbf.)')
Результат False в обоих случаях.
Уверен что не правильно построил вторую часть "и не оканчивается на .dbf."

Подскажите как должно быть правильно выстроено дабы отсеивать из списка файлы с некорректным расширением.

P.S. Расширение может быть с любым количеством точек
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 28.08.2012, 16:54   #2
Rififi
Старожил
 
Регистрация: 19.08.2009
Сообщений: 2,119
По умолчанию

Stilet

Первый файл не пригоден - у него испорчено расширение

На каком основании сделан такой вывод?
Вообще по описанию очень мутно понять, какой-же файл считается пригодным
Rififi вне форума Ответить с цитированием
Старый 28.08.2012, 17:53   #3
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
На каком основании сделан такой вывод?
Сторонняя программа (которую не возможно переписать) давится всеми у которых расширение не .dbf
Отсеивать нужно .dbf..DBF
Но в случае, описанном в топе так же отсеивается и те у кого расширение нормальное.

P.S. Я конечно могу проверять другим методом, но всетки регулярку освоить не помешало бы.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 28.08.2012, 18:00   #4
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию

Stilet, зачем такие сложности для столь простой задачи?
Исходя из правила: "Правильный файл" имеет формат <Имя файла с точками>.<расширение>. Ищите только расширение и считайте их кол-во.

Следует, что если файл имеет больше 1-го вхождения(совпадения) для значения .dbf (одна точка и знаки после неё), то это не правильный файл.
Регулярки тут не нужны вовсе, но для практики не плохо.

Последний раз редактировалось Человек_Борща; 28.08.2012 в 18:02.
Человек_Борща вне форума Ответить с цитированием
Старый 28.08.2012, 18:01   #5
Rififi
Старожил
 
Регистрация: 19.08.2009
Сообщений: 2,119
По умолчанию

Stilet

Сторонняя программа (которую не возможно переписать) давится всеми у которых расширение не .dbf

Ну тогда почему бы и не отсеять все файлы, у которых расширение не .dbf?

if not \.dbf$ then error

хотя зачем для этого регулярка...?

Shell API в Windos неплохо справляется, да и в Delphi есть свои функции..
Rififi вне форума Ответить с цитированием
Старый 28.08.2012, 18:14   #6
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию

Вот написал..
Код:
function TForm1.SearchIn(aStr:string; const cExt:string = '.dbf'):Smallint;
var
  s:string;
  p:Integer;
begin
  Result:=0;
  s:=LowerCase(aStr);
  p:=1;
  repeat
     p:=Pos(cExt,s);
     if p > 0 then
     begin
       Inc(Result);
       Delete(s,1,p+Length(cExt));
     end;
  until p = 0;
end;
Функция считает кол-во вхождений cExt в строку aStr.
Если результат больше 2-х, то это плохое имя файла.
Человек_Борща вне форума Ответить с цитированием
Старый 28.08.2012, 18:51   #7
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
хотя зачем для этого регулярка...?
Ой... Ну изучить я ее решил. Попробовать, применить...
Вдруг понравится?
Ладно, мысли уловил, для производства сделаю проверку на отсутствие .dbf. в принципе - пока этого хватит, но всетки для себя хочу знать как на регулярке такое расписать. Покручу еще мануалы, может дойдет наконец.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 28.08.2012, 18:55   #8
netrino
Участник клуба
 
Аватар для netrino
 
Регистрация: 15.07.2008
Сообщений: 1,933
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
В
Код:
TRegEx.IsMatch('d123456789.dbf','^d12(\d{7})(!$.dbf.)')
Результат False в обоих случаях.
Уверен что не правильно построил вторую часть "и не оканчивается на .dbf."
А почему бы вместо этого во второй части не сказать "и оканчивается на .dbf"?
Код:
^d12\d{7}\.dbf$
Под этот шаблон подойдут любые строки вида
d12XXXXXXX.dbf
где X - цифра
netrino вне форума Ответить с цитированием
Старый 28.08.2012, 20:15   #9
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
netrino
О! классная идея - обрубить строку после первого dbf.
Об этом я как-то не подумал. Спасибо.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
регулярные выражения Зод Общие вопросы Delphi 3 03.11.2011 11:18
регулярные выражения CodeNOT PHP 2 23.09.2011 12:11
составления условного выражения, эквивалентного данному AshimVeeskela Помощь студентам 2 30.08.2011 14:00
регулярные выражения Farrel PHP 3 06.02.2011 18:43
Прошу помощи. Нада проверить правильность составления проги. И помочь исправить ошибку Ascor Общие вопросы C/C++ 4 03.06.2008 10:54