Шаблон регулярного выражения для поиска нескольких форматов меток времени, избегая одних чисел

Я пытаюсь создать шаблон регулярного выражения, который найдет несколько форматов времени, таких как:

Я ожидаю, что эти результаты будут совпадать:

11:00PM - 11:00pm
11:00 PM - 11:00pm
11.PM
11.pm
21:00AM - 21am
21:00
11:00

Я хочу, чтобы регулярное выражение соответствовало приведенным выше шаблонам, однако в настоящее время оно также находит вечера, вечера, утра, утра и двузначные числа. Как я могу этого избежать? Значит, одиночные числа PM, AM не будут приняты?

Так например:

PM
AM
11
21
1

Также будет принято моим регулярным выражением.

ИЗМЕНИТЬ Я намерен избегать упоминания таких случаев, как:

PM
AM
11
21
1

ИЗМЕНИТЬ 2

Я исправил проблему с совпадением pm, am, PM, AM, однако числовые числа по-прежнему совпадают, состоящие из 1 или 2 цифр:

(\d{1,2})([.:](\d{1,2}))?[ .]?(am|pm|PM|AM)?

Вот ссылка на мой текущий паттерн:

Шаблон регулярного выражения


person ashes999    schedule 06.01.2021    source источник
comment
Какой результат вы ищете? Каким значениям должен соответствовать шаблон?   -  person Ronak Shah    schedule 06.01.2021
comment
Я добавил дополнительные пояснения, регулярное выражение соответствует обоим, однако я не хочу, чтобы оно совпадало со вторым pard, означающим PM, AM и только двузначные числа или однозначные числа.   -  person ashes999    schedule 06.01.2021
comment
Вы действительно ожидаете таких вещей, как 11.PM? Как вообще это действительное время?   -  person Tim Biegeleisen    schedule 06.01.2021
comment
Я отфильтровываю время с веб-страницы, и у некоторых есть этот формат, поэтому в качестве меры предосторожности я добавил, что моя основная проблема заключается в том, что он сопоставляет одно- и двузначные числа, а также PM, и я один. @TimBiegeleisen   -  person ashes999    schedule 06.01.2021
comment
Можете ли вы привести пример того, как вы хотите, чтобы результат выглядел?   -  person Daniel Freeman    schedule 06.01.2021
comment
Я добавил, какие результаты должны соответствовать @DanielFreeman   -  person ashes999    schedule 06.01.2021
comment
Извините, я перечитал ваш вопрос и до сих пор не понимаю, что вам нужно. Можете ли вы явно указать ввод и желаемый результат?   -  person Daniel Freeman    schedule 06.01.2021
comment
@DanielFreeman OP хочет просто подтвердить, соответствуют ли входные данные ожидаемым шаблонам. Это все :-)   -  person Tim Biegeleisen    schedule 06.01.2021


Ответы (2)


Следующий шаблон регулярного выражения, кажется, улавливает все, что вы хотите, исключая при этом то, что вам не нужно:

^\d+(?:(?:\.|:\d+)[ ]*(?:am|AM|pm|PM)?|(?:am|AM|pm|PM))(?:[ ]*-[ ]*\d+(?:(?:\.|:\d+)[ ]*(?:am|AM|pm|PM)?|(?:am|AM|pm|PM)))*$

Демо

Вот сценарий R, использующий grepl, который проверяет, работает ли шаблон в R:

x <- c("11:00PM - 11:00pm", "11:00 PM - 11:00pm", "11.PM", "11.pm", "21:00AM - 21am",
       "21:00", "11:00", "PM", "AM", "11", "21", "1")
grepl("^\\d+(?:(?:\\.|:\\d+)[ ]*(?:am|AM|pm|PM)?|(?:am|AM|pm|PM))(?:[ ]*-[ ]*\\d+(?:(?:\\.|:\\d+)[ ]*(?:am|AM|pm|PM)?|(?:am|AM|pm|PM)))*$", x)

[1]  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE FALSE FALSE FALSE FALSE FALSE
person Tim Biegeleisen    schedule 06.01.2021
comment
Да, именно так, избегайте совпадения числовых чисел, что было моей основной проблемой, спасибо! - person ashes999; 06.01.2021

Основываясь на одном вашем вопросе, похоже, что вы хотите, чтобы ввод содержал цифру и какой-либо тип формата (двоеточие, am / pm и т. Д.). Это должно обеспечить следующее:

pass <- c("11:00PM - 11:00pm", "11:00 PM - 11:00pm", "11.PM", "11.pm", 
          "21:00AM - 21am", "21:00", "11:00")
fail <- c("PM", "AM", "11", "21", "1")

stringr::str_detect(pass, ":|am|pm|AM|PM") & stringr::str_detect(pass, "\\d") # all TRUE
stringr::str_detect(fail, ":|am|pm|AM|PM") & stringr::str_detect(fail, "\\d") # all FALSE
person Daniel Freeman    schedule 06.01.2021
comment
Проблема с вашим ИСТИННЫМ шаблоном заключается в том, что он также будет соответствовать таким вещам, как :03 или 3:, которые, возможно, OP не хочет принимать. - person Tim Biegeleisen; 06.01.2021