将两种模式相互匹配

时间:2010-02-23 15:40:28

标签: regex

我正在创建一个日历,用户可以在其中设置单行的事件和时间,例如:

“6pm supper” - 仅限开始时间的活动

“8:00 - 16:00工作” - 有时间段的活动

正则表达式我目前正在使用以获取时间:

[\d]{1,2}[.|:]?[\d]{0,2}[\s]?[am|pm|AM|PM]{0,2}

它工作正常,但我无法弄清楚如果发生不必要的时间过滤,例如:

“下午6点晚餐时间晚上8点”餐厅“在这个例子中,'晚上8点'是一个餐馆名称,但它将被解释为具有时间段的事件,而事实并非如此。我想我必须编写一个正则表达式,它只匹配行开头的时间模式和之后的下一个模式,之间没有任何单词,但到目前为止我还没有成功构成这样的正则表达式。

有什么建议吗?

3 个答案:

答案 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实现都在所需的范围内支持此功能。大多数人似乎不允许。*在后面看。

相关问题