Что нового

Поиск диапазон дат с помощью функции StringRegExp

MRGYV

Новичок
Сообщения
29
Репутация
0
Добрый день!

Я пытаюсь с помощью функции StringRegExp получить список файлов за определенный диапазон дат.
Пока смог получить только за месяц, день, или ручным перебором. То есть, если нужно найти весь ноябрь, то я использую ".11." Если хочу 15 и 16, т о пишу "15.11.2016|16.11.2016"

Подскажите, пожалуйста, как нужно прописать, чтобы выбирался диапазон дат? То есть найти все даты с 01.11.2016 по 20.11.2016
Код:
$poistk_what2= IniRead($aFiles[$i], 'Тело', 'Срок выполнения до', "Нет доступа") 
$poistk_new_data=".11."

if $poistk_new_data <>"" and StringRegExp($poistk_what2,$poistk_new_data) Then  
   $iri5=$iri5+1 
   IniWrite(@ScriptDir & "\Settings\Список.ini", $poistk2&$poistk_new_data, $iri5, $aFiles[$i])
   
   EndIf
 

hedji

Продвинутый
Сообщения
409
Репутация
94
Записать даты в формате ГодМесяцДень, сравнивать целые числа.
20151231 < 20160120 < 20160201
 

ra4o

AutoIT Гуру
Сообщения
1,165
Репутация
246
Пример строки "$poistk_what2" приведите.
 
Автор
M

MRGYV

Новичок
Сообщения
29
Репутация
0
Спасибо, за ответы.

Хотелось бы именно через эту функцию, так как я меня 2 цели:
Первая сделать подобный поиск
Вторая лучше понять эту функцию.

Пример для $poistk_what2=22.11.2016
Данные берутся из нескольких ini файлов.



Добавлено:
Сообщение автоматически объединено:

Я конечно мог бы сделать так:
Код:
$f="01.11.2016"
$l="05.11.2016"

$f1=StringLeft ($f, 2)
$f2 = StringMid($f, 3, 10)
$l1=StringLeft ($l, 2)

$n=$f
For $i=$f1+1 To $l1
If $i<10 Then 
   $i2="0"&$i 
else 
   $i2=$i
EndIf    
$n=$n&"|"&$i2 & $f2
Next
MsgBox("",'',$n)
Но мне кажется, что это извращение и есть более правильный вариант
 

InnI

AutoIT Гуру
Сообщения
4,912
Репутация
1,429
MRGYV
найти все даты с 01.11.2016 по 20.11.2016
Код:
$s = ""
For $i = 1 To 20
  $s &= StringFormat("%02d%s", $i,".11.2016|")
Next
MsgBox(0, "", $s)

Но, насколько я понял, вам нужно не найти все даты, а проверить вхождение даты в диапазон
Код:
; с 01.11.16 до 20.11.16
$d = "12.11.2016"
If StringRegExp($d, "([01][0-9]|20)\.11\.2016") Then MsgBox(0, "", "OK")


лучше понять эту функцию
Функция всего лишь ищет совпадение с шаблоном. А вот чтобы составить шаблон, нужно "всего лишь" изучить язык регулярных выражений.

мне кажется, что это извращение
Нет. Это способ решения проблемы, основанный на текущих знаниях, умениях и опыте.

более правильный вариант
У каждого человека свой "правильный" вариант. Для меня правильный - это простой. В данном случае им является вариант, предложенный hedji.
 

Dm666

Осваивающий
Сообщения
221
Репутация
48
MRGYV сказал(а):
Хотелось бы именно через эту функцию, так как я меня 2 цели:
Первая сделать подобный поиск
Вторая лучше понять эту функцию.
На сайте есть совершенно гениальные Уроки по RegExp от RedLine.
Очень доходчиво написано, мне помогло разобраться с моментально. Очень рекомендую.
 
Автор
M

MRGYV

Новичок
Сообщения
29
Репутация
0
Спасибо огромное!
А Вы могли бы пояснить принцип действия:
Код:
StringRegExp($d, "([01][0-9]|20)\.11\.2016")


[0-9]- это поиск от 0 до 9?
[01]- что это такое?
"|20"- соединить с 20...тоже не понятно. Я так понял это указание крайней даты?
"\." - экранировать точку, чтобы она как точка определялась.
 

InnI

AutoIT Гуру
Сообщения
4,912
Репутация
1,429
MRGYV
пояснить принцип действия
Может вам всё-таки прочитать уроки и попробовать разобраться самостоятельно?
В противном случае вы просто не сможете изменить данный шаблон на другой интервал.
 
Автор
M

MRGYV

Новичок
Сообщения
29
Репутация
0
Да я пробую, Напоследок, подскажите, пожалуйста, как будет для этой функции указать период с 04.03.2016 по 11.08.2016? Я думаю, с этой информацией мне будет легче разобраться...

Dm666 Пробую, разобраться по Вашей ссылке. Для того, чтобы лучше понимать, переделал код так:
$sText = 'удав 11 человек 2 крокодил 4'
$sPattern = '\s?(.*?)\s(\d+)'
If StringRegExp($sText, $sPattern, 1) Then MsgBox("","","Ok")

Теперь он не работает...
 

InnI

AutoIT Гуру
Сообщения
4,912
Репутация
1,429
MRGYV
для этой функции указать период
Регулярные выражения применяются для работы с текстом. Но дата - это не просто текст. Для работы с датами (а тем более с временными интервалами) нужно использовать специализированные функции или представление даты в виде числа. Регулярки в данном случае неоправданны.
 
Автор
M

MRGYV

Новичок
Сообщения
29
Репутация
0
Кое что начало проясняться...
Я правильно понимаю, что, например, в этой конструкции:
Код:
$d = "12.11.2016"
If StringRegExp($d, "([0-3][1-9])\.11\.2016") Then MsgBox(0, "", "OK")


[0-3]- отвечает за то, какой будет 1 цифра
[1-9]- отвечает за то, какой вторая

То есть простыми словами, для "12.11.2016" определяются ограничения для 1 и 2.
Если это так, то задать период(не создавая функцию), чтобы соблюсти ограничения, например "с 05.11.16 до 19.11.16" не возможно.
Так как если я ограничу с период с 5 числа, то наложу ограничения и на диапазоны после 15, и после 25.
 

InnI

AutoIT Гуру
Сообщения
4,912
Репутация
1,429
MRGYV
в этой конструкции
Если вы вдруг ошибётесь и напишите "37.11.2016", то тоже попадёте в диапазон. А при работе с функциями даты-времени будет ошибка.
Кстати, в вашу "конструкцию" не попадут числа 10, 20 и 30 (догадайтесь - почему).

Код:
"(0[5-9])|(1[0-9])\.11\.16"

Или можно тупо перечислить все варианты от "05" до "19", как вы делали ранее.
 
Автор
M

MRGYV

Новичок
Сообщения
29
Репутация
0
Из-за ограничения 1-9 :smile:

Спасибо большое, что помогли разобраться. Я думаю тему можно закрывать.
Последний вопрос. Я правильно понимаю, что в auoit, нет аналогии функций DateSerial(2003, 04, 01) и DateValue("07.06.12")? Тоже поиском не нашел...
 

hedji

Продвинутый
Сообщения
409
Репутация
94
вот здесь смотрели? https://autoit-script.ru/autoit3_docs/libfunctions/date%20management.htm
 
Верх