Форум » [x]Harbour » Как проверить файл на соответствие маске? » Ответить

Как проверить файл на соответствие маске?

AM: Такой глупый вопрос, но ответа я не могу найти, хотя вещь вроде стандартная. Существует ли стандартная функция, которая определяет, соответствует ли имя файла (скажем, '5544.832') маске (скажем, '*.832')? Просто две строки на входе и логика на выходе. Наверняка не мне одному это понадобится.

Ответов - 10

Петр: Для Harbour смотрите ? hb_wildMatch("*.832","5544.832", .f. ) ? hb_wildMatch("*.832","5544.832", .t. ) ? hb_wildMatch("*.837","5544.832", .f. ) ? hb_wildMatch("*.837","5544.832", .t. ) Есть еще регистронезависимый вариант - функция hb_wildMatchI Для xHb скорее всего эта функция называется WildMatch

SADSTAR33: как проверить на соответствие формату? например - от 1 до 3 цифр "." от 1 до 3 цифр "." - короче АйПишник или - две больших русских буквы "-" две цифры и т.п.

Dima: SADSTAR33 пишет: как проверить на соответствие формату? HB_RegExMatch + почитать , это для начала http://www.codenet.ru/webmast/php/regexps.php


Димидрол: 1. Регулярными выражениями 2. не от 1 до 3 цифр, а от 0 до 255. и айпи может записываться различными способами 0300.0xab.1.1 - первый байт в 8ричном виде, второй в 16ричном или одним 4-байтовым целым 3578349857 надо использовать специальную библиотек для работы с айпи)))

SADSTAR33: Вариант Проверка на соответствие десятично-точечному формату [pre] function IsIP(p) local result:=.t., ar:={}, a, l, i ar:=HB_ATOKENS(p,".") if len(ar)#4; return .f.; endif for i:=1 to 4 a:=ar[ i ] l:=len(a) if l=1 if !HB_RegExMatch("\d",a) result:=.f. endif elseif l=2 if !HB_RegExMatch("[1-9]\d",a) result:=.f. endif elseif l=3 if !HB_RegExMatch("[1-2]\d\d",a) result:=.f. elseif val(a)>255 result:=.f. endif else result:=.f. endif if !result; exit; endif next return result [/pre] Насколько рационально? Можно все result:=.f. заменить на return .f., убрать прерывание цикла и закончить return .t. т.е. убрать переменную result совсем

Dima: Еще вариант (самый простой и при желании его можно навернуть) [pre2] Func IsIP(p) return HB_RegExMatch("([0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3})",p) [/pre2]

SADSTAR33: Этот вариант я первым делом проверил прежде чем наворотами заниматься 333.333.333.333 пройдет? 333.333.333.3334 тоже пройдет. 12345.333.333.12345 тоже пройдет. вот так уже лучше "^([0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3})$" но все равно на max255 не проверяет

Dima: SADSTAR33 пишет: "^([0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3})$" но все равно на max255 не проверяет Точно , не подумал [pre2] Func IsIP(p) local ret:=.t. local creg:="^([0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3})$" local j if !HB_RegExMatch(creg,p) return .f. endif for each j in HB_ATOKENS(p,".") if val(j)>255 return .f. endif next return ret [/pre2]

SADSTAR33: Для полного счастья - удалить local ret:=.t. заменить return ret на return .t.

Dima: SADSTAR33 пишет: local ret:=.t. это уже привычка ;)



полная версия страницы