用于查找多个时间戳格式的正则表达式模式,避免单独使用单个数字

Regex pattern to find multiple timestamp formats avoid single numbers alone

我正在尝试创建一个可以找到多种时间格式的正则表达式模式,例如:

我希望这些输出匹配:

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

我希望正则表达式匹配上面的模式,目前确实如此,但是,这也可以找到 pm、PM、am、AM 和两位数,如何才能我避免这个?意思是单号一个PM,单AM不接受?

例如:

PM
AM
11
21
1

我的正则表达式也会接受。

编辑 我的意图是避免提及以下情况:

PM
AM
11
21
1

编辑 2

我已经解决了 match pm, am, PM, AM 的问题,但是它仍然匹配 1 位或 2 位数字:

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

这是我当前模式的link:

Regex Pattern

以下正则表达式模式似乎可以捕获您想要的所有内容,同时排除您不需要的内容:

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

Demo

这是一个使用 grepl 的 R 脚本,它验证该模式在 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

根据您的问题,您似乎希望输入包含数字和某种格式(冒号、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