首页 > 解决方案 > 查找多种时间戳格式的正则表达式模式避免单独使用单个数字

问题描述

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

我希望这些输出匹配:

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)?

这是我当前模式的链接:

正则表达式模式

标签: regexregex-group

解决方案


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

^\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

推荐阅读