Страницы: 1
RSS
Создание паттерна для извлечения времени ЧЧ:ММ через регулярные выражения RegExp
 
Добрый день, помогите пожалуйста!

Часть 1(Решена). Нужно создать паттерн извлекающий все варианты заведения времени такие как , с(от) чч:мм по(до) чч:мм, или просто чч:мм, или с(от) чч:мм, или по(до) чч:мм
В файле анализируемая строка А, результат B, паттерны(С), а в столбце D) желаемый результат
по отдельности создать паттерн получается но сделать общий никак.
Надеюсь понятно описал.
UP темы
Часть 2.(Поиск решения) Подскажите как исключить выборку формата чч:мм использую этот паттерн (([0-1]\d|2[0-3])[^\:][0-5]\d)|([0-1]\d|2[0-3][^\:])
на входе строка может быть как ЧЧ [любой разделитель кроме : ] ММ так и только ЧЧ (перевожу его в ЧЧ:00).
Надо исключить если приходит правильно заведенное время  
Изменено: Mergens - 28.03.2021 01:13:20
 
Может так: (с|от|по|до)\s?(\d{2}:\d{2})|(\d{2}:\d{2})
А ещё добавьте в формулу СЖПРОБЕЛЫ: RegExpExtract(СЖПРОБЕЛЫ($A$4);$C$5;0)
Изменено: msi2102 - 26.03.2021 16:31:20 (Добавил "?" после s на случай если будет отсутствовать пробел)
 
Цитата
msi2102 написал:
(с|от|по|до)\s(\d{2}:\d{2})|(\d{2}:\d{2})
почти, нужно чтобы понимало по отдельности интервалы (с|от чч:мм по|до чч:мм) или (чч:мм) или (с|от чч:мм ) или (по|до чч:мм)
 
Вы посмотрите, что у Вас в столбце D (графа "Нужно получить") По моему получается именно то, что вы там написали
Извиняюсь не заметил отсутствия точки с запятой
Изменено: msi2102 - 26.03.2021 16:37:28
 
Ну как-то так
((с |от )\d{2}:\d{2}.(по |до )?\d{2}:\d{2}|(с ?|от ?|по ?|до ?)?\d{2}:\d{2})
 
RAN, спасибо, работает, тестирую.
 
или так: (с|от)\s?(\d{2}:\d{2})\s(по|до)\s?(\d{2}:\d{2})|(с|от|по|до)\s?(\d{2}:\d{2})|(\d{2}:\d{2})|(\d{2}:\d{2})
 
Спасибо, тоже работает, тестирую, мне еще втыкать ([0-1]\d|2[0-3]):[0-5]\d - т.к. надо брать точно, что это именно время, а не суммарное объем времени типа 156:44.
 
Цитата
Mergens написал:
мне еще втыкать
Муля, ты меня нервируешь!  :)
((с|от) \d{2}:\d{2}.(по|до) \d{2}:\d{2}|(с|от|по|до)? \d{2}:\d{2})
 
А ну да точнО! чето я видимо совсем сегодня не соображаю.

в итоге пока получилось как то так
(с|от)\s?(([0-1]\d|2[0-3]):[0-5]\d)\s(по|до)\s?(([0-1]\d|2[0-3]):[0-5]\d)|(с|от|по|до)\s?(([0-1]\d|2[0-3]):[0-5]\d)|(([0-1]\d|2[0-3]):[0-5]\d)
Изменено: Mergens - 26.03.2021 16:57:27
 
  • Ещё нужно (с|от) и (по|до) учесть пробел перед предлогами ( с| от) и ( по| до), а то "баркас 12:45" тоже найдет как "с 12:45", вместо просто "12:45"
Изменено: msi2102 - 26.03.2021 17:05:43
 
8-0  :(  точно
 
Код
     .Pattern = "(с |от )?(([0-1][0-9]|[2][0-3]):([0-5][0-9]))( до | по )?(([0-1][0-9]|[2][0-3]):([0-5][0-9]))?"
Изменено: Kuzmich - 26.03.2021 17:29:24
 
Kuzmich Спасибо, это самый короткий вариант!
 
Прошу подсказать с паттерном, Часть 2 в теме.
 
Mergens, написал
Цитата
Надо исключить если приходит правильно заведенное время
Как-то наоборот приводят к правильному написанию времени при различных разделителях типа , / или -
Цитата
так и только ЧЧ
Где критерий, что две цифры относятся к времени, а не к номеру дома?
 
Цитата
Как-то наоборот приводят к правильному написанию времени при различных разделителях типа , / или -
Вы правы, вот как раз я такой случай и рассматриваю, что могут завести различными разделителями, или без разделителя просто указав конкретный час, это мне и требуется получить, если время не корректным разделителем меняем разделитель на корректный :, если завели просто час, добавляю разделитель : и 00.
Но если завели время в правильном формате, то мне надо игнорировать такое заведение.
Исключить имелось в виду написание в паттерне исключения по корректно заведенных чч:мм, чтобы не попадали в выборку

например :
все ниже меняем на 12:00
12
12,00
12*00
12-00
12/00
12+00
но если завели 12:00 то менять ничего не надо и данная запись не должна попасть в выборку.
Цитата
Где критерий, что две цифры относятся к времени, а не к номеру дома?
Тут ничего не поделать, в табеле учета времени должно быть только время. все другое будет нищядно изменяться на времяя
Изменено: Mergens - 28.03.2021 14:47:56
 
Цитата
все ниже меняем на 12:00
12
12,00
12*00
12-00
12/00
12+00
Код
Function iTime(cell$)
Dim mo As Object
 With CreateObject("VBScript.RegExp")
     .Global = True
     .Pattern = "([0-1][0-9]|[2][0-3])([,|/|\-|\.|\*|\+])?([0-5][0-9])?"
   If .test(cell) Then
   Set mo = .Execute(cell)
     If mo.Count = 1 Then
       iTime = .Replace(cell, "$1:00")
     Else
       iTime = .Replace(cell, "$1:$3")
     End If
   Else
     iTime = ""
   End If
 End With
End Function
 
Kuzmich, Спасибо больше.  А конструкция [^\:] не подойдёт?
([0-1][0-9]|[2][0-3])([^\:])?([0-5][0-9]), и что значит знак $ в замене? "$1:00", "$1:$3"
 
Цитата
А конструкция [^\:] не подойдёт?
Так попробуйте.
Цитата
что значит знак $ в замене? "$1:00", "$1:$3"
$1- первая скобочная группа - ([0-1][0-9]|[2][0-3])
$3 - третья группа - ([0-5][0-9])
 
Kuzmich, спасибо, я не знал что можно указывать для метода .Replace указатели места замены из шаблона.

Конструкция [^\:] работает. Спасибо.

"К сожалению так и не получилось избавится от корректной записи, все равно обрабатывается и она попадает.
В файле приложил сделав новую функцию и паттерн к ней.

Посмотрите пожалуйста, что можно сделать."

Update: кажется нашел решение таким паттерном  ([0-1][0-9]|[2][0-3])([^\:])?([0-5][0-9])([^\:])? - не работает если ЧЧ
Изменено: Mergens - 29.03.2021 11:07:00
 
Может так:
([0-1][0-9]|[2][0-3])([,|/|\-|\.|\*|\+|:])?([0-5][0-9])?
 
Цитата
Может так:
([0-1][0-9]|[2][0-3])([,|/|\-|\.|\*|\+|:])?([0-5][0-9])?
Работает, Спасибо.
Но, придется все таки перечислить все знаки разделители. Я исходил из того чтобы взять любое, что похоже на ЧЧ ММ или ЧЧ, и исключить корректно заведенное через ЧЧ:ММ ([^\:])?.  
Изменено: Mergens - 29.03.2021 11:06:29
Страницы: 1
Наверх