正则表达式以匹配涉及上午/下午的时间范围,例如上午7点至晚上10点

吉涅什·戈赫尔(Jignesh Gohel)

我写了以下正则表达式

(1[012]|[1-9])(am|pm)\-(1[012]|[1-9])(am|pm)

匹配以下类型的时间格式:

7am-10pm (matches correctly and creates 4 match groups 7, am, 10, pm)

13am-10pm (this should not be matched, however it matches and creates 4 match groups 3, am, 10, pm)

10pm (this doesn't match as expected because it doesn't specify the time range end)

111am-10pm (this should not be matched, however it matches and creates 4 match groups 11, am, 10, pm)

如何改善我的正则表达式,这样我就不需要重复数字和am / pm模式,还可以进行以下操作:

  1. 它仅捕获时间范围成分,例如上午7点至上午10点,因此应该只有2个匹配组,上午7点,上午10点。

  2. 它仅匹配适当的时间,例如111am或13pm等,应视为不匹配。

  3. 我不知道是否可以使用正则表达式,但是我们可以使正则表达式匹配正确的时间范围,例如7 am-1pm应该匹配,但是4 pm-1pm应该被视为不匹配吗?

注意:我正在使用Ruby 2.2.1

谢谢。

失败的开发

首先,让我们看看您做错了什么:

上午13点至晚上10点(不应该匹配,但是它会匹配并创建4个匹配组3,am,10,pm)

它仅匹配适当的时间,例如111am或13pm等,应视为不匹配。

之所以匹配,是因为您可以在此处匹配单个数字[1-9]:(1 [012] | [1-9])。

为了解决此问题,您应该允许一个[1-9]数字或1 + [0-2]。由于我们不知道正则表达式何时开始,因此我们将使用一些单词边界来确保我们有一个“单词开始”。

由于您不想捕获数字,而是希望捕获所有时间加上am | pm,因此可以使用非捕获组:

\b((?:1[0-2]|[1-9])

然后,只需重复自己并添加破折号即可:

\b((?:1[0-2]|[1-9])[ap]m)-((?:1[0-2]|[1-9])[ap]m)

关于第3点。是的,您可以使用正则表达式做到这一点,但是最好通过在进入第1组和第2组后简单地添加逻辑检查来查看时间范围是否确实有意义。

总而言之,这就是您得到的:

# \b((?:1[0-2]|[1-9])[ap]m)-((?:1[0-2]|[1-9])[ap]m)
# 
# 
# Assert position at a word boundary «\b»
# Match the regular expression below and capture its match into backreference number 1 «((?:1[0-2]|[1-9])[ap]m)»
#    Match the regular expression below «(?:1[0-2]|[1-9])»
#       Match either the regular expression below (attempting the next alternative only if this one fails) «1[0-2]»
#          Match the character “1” literally «1»
#          Match a single character in the range between “0” and “2” «[0-2]»
#       Or match regular expression number 2 below (the entire group fails if this one fails to match) «[1-9]»
#          Match a single character in the range between “1” and “9” «[1-9]»
#    Match a single character present in the list “ap” «[ap]»
#    Match the character “m” literally «m»
# Match the character “-” literally «-»
# Match the regular expression below and capture its match into backreference number 2 «((?:1[0-2]|[1-9])[ap]m)»
#    Match the regular expression below «(?:1[0-2]|[1-9])»
#       Match either the regular expression below (attempting the next alternative only if this one fails) «1[0-2]»
#          Match the character “1” literally «1»
#          Match a single character in the range between “0” and “2” «[0-2]»
#       Or match regular expression number 2 below (the entire group fails if this one fails to match) «[1-9]»
#          Match a single character in the range between “1” and “9” «[1-9]»
#    Match a single character present in the list “ap” «[ap]»
#    Match the character “m” literally «m»

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

周一至周五上午10点的Cron表达式,每月的最后一天除外

来自分类Dev

Cron表达式,用于在上午11点运行任务,并在晚上11点完成

来自分类Dev

Jenkins-如何计划在周一至周五的上午7点至晚上10点之间每2小时运行一次构建

来自分类Dev

如何编写一个cron表达式,该表达式在晚上12点运行,每两个小时运行一次,直到上午12点,并且每天运行相同的时间?

来自分类Dev

日期之间的DATEDIFF是基于营业时间(上午8点至下午5点)而不是总时数或天数

来自分类Dev

以 30 分钟块 + 阵列显示上午 9 点至下午 5 点以划掉“不可用”时间

来自分类Dev

AlarmManager计划从上午9点至下午4点每10分钟运行一次

来自分类Dev

如何在一个时间段内(例如从上午10点到下午12:30)启动/停止Python函数?

来自分类Dev

正则表达式匹配点,但不匹配末尾

来自分类Dev

在Java中根据时间显示上午,下午,晚上,夜间消息

来自分类Dev

JavaScript正则表达式匹配忽略文字点

来自分类Dev

bash正则表达式点“。” 字符不匹配

来自分类Dev

正则表达式包含点的匹配词

来自分类Dev

用于在晚上10点至上午9点之间进行检查的python脚本

来自分类Dev

正则表达式匹配时间范围

来自分类Dev

正则表达式匹配时间范围

来自分类Dev

如何仅在特定的12小时时段(上午9点至晚上9点)隐藏卖家的详细联系信息

来自分类Dev

如何在Android中以60分钟的间隔安排每天的上午12点至下午6点之间的工作?

来自分类Dev

匹配范围的正则表达式

来自分类Dev

如何让 R 正则表达式捕获特殊字符(例如点 (.) 和下划线 (_))?

来自分类Dev

正则表达式匹配单个点,但不匹配数字或后缀

来自分类Dev

如何将一天中的时间分为 3 个时段:上午、下午和晚上?

来自分类Dev

使用正则表达式在正则表达式中查找正则表达式点

来自分类Dev

使用正则表达式在正则表达式中查找正则表达式点

来自分类Dev

如何在日食查找正则表达式中用点(DOTALL)匹配多行

来自分类Dev

如何使用正则表达式匹配Unicode字符代码点12288

来自分类Dev

仅将点与标点匹配的Javascript正则表达式,无数字

来自分类Dev

Javascript正则表达式匹配用空格分隔但不包含点的字符串

来自分类Dev

PatIndex模式/正则表达式:如何匹配点后跟空格

Related 相关文章

  1. 1

    周一至周五上午10点的Cron表达式,每月的最后一天除外

  2. 2

    Cron表达式,用于在上午11点运行任务,并在晚上11点完成

  3. 3

    Jenkins-如何计划在周一至周五的上午7点至晚上10点之间每2小时运行一次构建

  4. 4

    如何编写一个cron表达式,该表达式在晚上12点运行,每两个小时运行一次,直到上午12点,并且每天运行相同的时间?

  5. 5

    日期之间的DATEDIFF是基于营业时间(上午8点至下午5点)而不是总时数或天数

  6. 6

    以 30 分钟块 + 阵列显示上午 9 点至下午 5 点以划掉“不可用”时间

  7. 7

    AlarmManager计划从上午9点至下午4点每10分钟运行一次

  8. 8

    如何在一个时间段内(例如从上午10点到下午12:30)启动/停止Python函数?

  9. 9

    正则表达式匹配点,但不匹配末尾

  10. 10

    在Java中根据时间显示上午,下午,晚上,夜间消息

  11. 11

    JavaScript正则表达式匹配忽略文字点

  12. 12

    bash正则表达式点“。” 字符不匹配

  13. 13

    正则表达式包含点的匹配词

  14. 14

    用于在晚上10点至上午9点之间进行检查的python脚本

  15. 15

    正则表达式匹配时间范围

  16. 16

    正则表达式匹配时间范围

  17. 17

    如何仅在特定的12小时时段(上午9点至晚上9点)隐藏卖家的详细联系信息

  18. 18

    如何在Android中以60分钟的间隔安排每天的上午12点至下午6点之间的工作?

  19. 19

    匹配范围的正则表达式

  20. 20

    如何让 R 正则表达式捕获特殊字符(例如点 (.) 和下划线 (_))?

  21. 21

    正则表达式匹配单个点,但不匹配数字或后缀

  22. 22

    如何将一天中的时间分为 3 个时段:上午、下午和晚上?

  23. 23

    使用正则表达式在正则表达式中查找正则表达式点

  24. 24

    使用正则表达式在正则表达式中查找正则表达式点

  25. 25

    如何在日食查找正则表达式中用点(DOTALL)匹配多行

  26. 26

    如何使用正则表达式匹配Unicode字符代码点12288

  27. 27

    仅将点与标点匹配的Javascript正则表达式,无数字

  28. 28

    Javascript正则表达式匹配用空格分隔但不包含点的字符串

  29. 29

    PatIndex模式/正则表达式:如何匹配点后跟空格

热门标签

归档