用于查找多个时间戳格式的正则表达式模式,避免单独使用单个数字
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:
以下正则表达式模式似乎可以捕获您想要的所有内容,同时排除您不需要的内容:
^\d+(?:(?:\.|:\d+)[ ]*(?:am|AM|pm|PM)?|(?:am|AM|pm|PM))(?:[ ]*-[ ]*\d+(?:(?:\.|:\d+)[ ]*(?:am|AM|pm|PM)?|(?:am|AM|pm|PM)))*$
这是一个使用 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
我正在尝试创建一个可以找到多种时间格式的正则表达式模式,例如:
我希望这些输出匹配:
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:
以下正则表达式模式似乎可以捕获您想要的所有内容,同时排除您不需要的内容:
^\d+(?:(?:\.|:\d+)[ ]*(?:am|AM|pm|PM)?|(?:am|AM|pm|PM))(?:[ ]*-[ ]*\d+(?:(?:\.|:\d+)[ ]*(?:am|AM|pm|PM)?|(?:am|AM|pm|PM)))*$
这是一个使用 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