egrep для времени в формате H: MM: SS

456
Serg12

При работе с файлом необходимо выполнить поиск строки с отметкой времени в формате H: MM: SS. Я попробовал следующий egrep '[0-9]: [0-9]: [0-9]'. Не работал для меня Что я делаю не так в регулярных выражениях?

0
Можете ли вы предоставить образец файла, на котором вы его запускаете, что вы ожидаете получить и что вы получаете вместо этого? Диагностика регулярных выражений намного проще, если мы сможем увидеть данные и понять ваши ожидания. MaQleod 10 лет назад 0

3 ответа на вопрос

3
Sirius_Black

если вы хотите совпадать с
00:00:00 до 23:59:59

egrep '([0-1][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9]'t 

если вы хотите совпадать с
12:00 до 00:59

egrep -i '((?:0[0-9]|1[012]):[0-5][0-9]:[0-5][0-9]\s?(?:a|p)m)' 
Для второго измените `[0-1] [0-2]` на `(0 [0-9] | 1 [012])`, что вводит крайние случаи времен> «12:00:00» glenn jackman 10 лет назад 0
фактически [0-1] [0-2] будет соответствовать от 00 до 12, поскольку [0-1] будет соответствовать 0 или 1, но не обоим, а [0-2] будет соответствовать 0 или 2, но не обоим, поэтому [ 0-1] [0-2] будет соответствовать для [0-1] -> 0 [0-2] -> 0 = 00:00:00 или [0-1] -> 1 [0-2] -> 2 = 12:00:00 Sirius_Black 10 лет назад 0
Ну, это регулярное выражение соответствует 03:00:00 утра? glenn jackman 10 лет назад 0
@glennjackman извините, я понял, что ошибка, спасибо за замечание Sirius_Black 10 лет назад 0
0
Azz

[0-9]:[0-9]:[0-9] будет соответствовать H: M: S, бот не H: MM: SS.

Каждый набор квадратных скобок соответствует одному символу.

Таким образом, чтобы получить что-то, что соответствует H: MM: SS, вы можете использовать:

[0-9]:[0-9][0-9]:[0-9][0-9]

Обратите внимание, что выше НЕ будет соответствовать H: M: S

Для соответствия H: MM: SS ИЛИ H: M: S ИЛИ H: M: SS ИЛИ H: MM: S используйте следующее

[0-9]:[0-9]+:[0-9]+

+ означает совпадение с последним символом, 1 или более раз (включая первое совпадение)

Извините, но, насколько я помню, `.` соответствует ЛЮБОМУ персонажу. Не последний снова. Это означает, что `[0-9] .` соответствует` 5a` и `7-`, а также `33`. И вам не нужно экранировать `:` (это не имеет никакого регулярного выражения). Следовательно: Ваш ответ неверный. erik 10 лет назад 0
Виноват! Вы правы, сэр. Редактирование сейчас ... Нет ли символа повторения, который можно повторить один раз и только один раз? (Я не могу найти один, поэтому я думаю, что лучший способ это `[0-9]: [0-9] [0-9]: [0-9] [0-9]` Azz 10 лет назад 0
Я не знаю ни одного символа повторения (это не vim). Я использую `` для запроса конкретного `NUMBER` повторений, смотрите мой ответ. erik 10 лет назад 0
0
erik

Я предлагаю вам использовать

egrep '[0-9]:[0-9]:[0-9]' 

где означает совпадение с последним символом как минимум два раза и максимум два раза (= ровно два раза), где последний символ в этом примере был числом от 0 до 9.

Если вы хотите найти по крайней мере один и максимум два, вы должны изменить его на

egrep '[0-9]:[0-9]:[0-9]' 

который соответствует, например, 0:1:22и 0:11:22и 00:11:22и 00:11:2и так далее.

Ответ Sirius_Black дал также тестирование в реальном времени. Мой ответ будет соответствовать нереалистичным временам, таким как 99:99:99, что, однако, может быть продолжительностью.

Похожие вопросы