Regex не работает, следуя по неверному пути в аргументе - PullRequest
0 голосов
/ 18 февраля 2019

У меня есть аргумент регулярного выражения.который проверяет содержимое переменной, в данном случае это время, в формате ЧЧ: ММ: СС, но при запуске строки кода система следует по пути, чтобы показать, что она не прошла и не соответствует критериям.!($11~/^(?:[01]?\d|2[0-3]):[0-5]\d:[0-5]\d|^$/) {print "11th field invalid";} это вышеупомянутый код, а вот содержимое переменной "11:40:59".

Теперь я хочу, чтобы код продолжал выполнение программы, если внутри переменной содержится время.однако, если, например, внутри переменной есть буквенный символ, я хочу, чтобы программа напечатала «11-е поле недействительным» и вышла из программы.

также я проверяю аргумент regex в тестере вместе с переменной, и она соответствует

Ответы [ 2 ]

0 голосов
/ 18 февраля 2019

Используя ERE, поддерживаемый awk, этот PCRE (если я правильно понимаю):

!($11~/^(?:[01]?\d|2[0-3]):[0-5]\d:[0-5]\d|^$/)

будет:

!($11~/^([01]?[0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9]|^$/)

, но вы можете написать выражение вместо этого:

!($11~/^([01]?[0-9]|2[0-3])(:[0-5][0-9]){2}|^$/)

и по-прежнему отсутствует завершающий $ в ненулевой части, поэтому на самом деле он должен быть:

!($11~/^(([01]?[0-9]|2[0-3])(:[0-5][0-9]){2})?$/)

или:

$11 !~ /^(([01]?[0-9]|2[0-3])(:[0-5][0-9]){2})?$/
0 голосов
/ 18 февраля 2019

Awk не поддерживает PCRE .Как упоминалось в комментарии, \d и ?: не поддерживаются.

Если вы используете GNU awk, альтернативой проверки правильности времени является использование функции mktime.

split($11, a, ":")  
if(mktime("2019 1 1 " a[1] " " a[2] " " a[3]) == -1){ 
   print "11th field invalid"
}

Первая строка заполняет массив a полями часа, минуты и секунды.Функция mktime возвращает -1, если создание даты не удается.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...