我正在创建一个日历,用户可以在其中设置单行的事件和时间,例如:
“6pm supper” - 仅限开始时间的活动
“8:00 - 16:00工作” - 有时间段的活动
正则表达式我目前正在使用以获取时间:
[\d]{1,2}[.|:]?[\d]{0,2}[\s]?[am|pm|AM|PM]{0,2}
它工作正常,但我无法弄清楚如果发生不必要的时间过滤,例如:
“下午6点晚餐时间晚上8点”餐厅“在这个例子中,'晚上8点'是一个餐馆名称,但它将被解释为具有时间段的事件,而事实并非如此。我想我必须编写一个正则表达式,它只匹配行开头的时间模式和之后的下一个模式,之间没有任何单词,但到目前为止我还没有成功构成这样的正则表达式。
有什么建议吗?
答案 0 :(得分:1)
如果您使用以下正则表达式
,该怎么办?([\d]{1,2}[.|:]?[\d]{0,2}[\s]?[apm|APM]{0,2})( - )?([\d]{1,2}[.|:]?[\d]{0,2}[\s]?[apm|APM]{0,2})?(.*)
这样您就可以访问不同的部分,例如下午6点在'晚上8点'餐厅吃晚饭 将是:
(6pm)()()( supper at '8pm' restaurant)
$1 $2$3 $4
答案 1 :(得分:0)
^[\d]{1,2}[.|:]?[\d]{0,2}[\s]?[am|pm|AM|PM]{0,2}
会解决匹配示例中“8pm”的问题吗?
^
用于匹配行的开头。 $
可用于匹配行的末尾(如果您以后需要它;)。
<强>更新强>
这个有点难看,但似乎有效:
[^'"][\d]{1,2}[.|:]?[\d]{0,2}[\s]?[am|pm|AM|PM]{0,2}[^'"]|^[\d]{1,2}[.|:]?[\d]{0,2}[\s]?[am|pm|AM|PM]{0,2}
第一个选项确保如果时间出现在字符串的中间,则不能被任何类型的引号字符包围。第二个选项允许在字符串开头的时间。这看起来很难看,可能会有所改善......但它似乎对我有用。
<强>更新强>
我认为这个版本更容易阅读:
([^'"]|^)[\d]{1,2}[.|:]?[\d]{0,2}[\s]?[am|pm|AM|PM]{0,2}[^'"]
答案 2 :(得分:0)
您可以尝试使用lookbehind构造,仅选择不包含“a”,“p”和“m”以外的字母的日期。
中的某些内容(?<![letters other than apm].*)
根据http://www.regular-expressions.info/lookaround.html,并非所有Regex实现都在所需的范围内支持此功能。大多数人似乎不允许。*在后面看。