我正在寻找为这些模式创建一个正则表达式:
[num] [am]
[num] [pm]
[num] [-] [num]
[num] [:] [num]
有或无空格
就是判断一个句子中是否有时间。理想情况下,它实际上会解析出时间。句子会是这样的:
“This event is at 9am at…”
“Blues, 5:30, pressroom..”
“Meet at 5pm!”
“All night 9-8 rockin’ it!”
我的项目在 .NET 中,以防万一。
与其拥有一个灵活的正则表达式,我更喜欢多个正则表达式(最有可能为您想要匹配的每种类型的模式一个),并应用每一个,直到您获得匹配。请注意,您可以使用这种方法来识别不明确的时间规范。
这种方法更容易编码和维护(将来您可能需要更多时间格式,并且添加新的特定正则表达式而不是修改已经复杂/灵活的正则表达式是微不足道的)。
鉴于您的定义,我认为这样的事情几乎可以做到:
"\\b(1[012]|[1-9])(\\s?(am|pm)|:[0-5][0-9]|-(1[012]|[1-9]))\\b"
这要求一小时在 1-12 之间,分钟在 0-59 之间。它还需要围绕时间的单词边界。它不允许破折号或冒号周围有空格。
尽管如此,根据定义,您会得到很多误报,尤其是您的[num]-[num]
格式,它看起来很像日期和其他内容。
在这里测试。我没有找到特定的 .NET 测试仪,但我认为这都是标准的。
从那个“语法”构建一个正则表达式非常简单,看看 RegExes!
/(\d{1,2})\s*([:-]\s(\d{1,2})|am|pm)/
我已将您的数字限制为 2 个字符长,您可能会忽略它,因为您可能会查看时间是否在有效范围内。要解析匹配的字符串,您可以从结果中提取匹配组。