通过正则表达式找到时间

时间:2014-11-13 12:46:47

标签: regex

我需要从给定的文本中找到检索时间,例如今晚加入我们共进晚餐,直到晚上10点#LeBunSocial @ 3compasses#e8 #Dalston

对于上述条件,下面代码完全正常

  if (Regex.IsMatch(str, @"(?'hour'\d{2})(?'ampm'AM|am|PM|pm|Pm)", RegexOptions.Compiled)) //2 digits + pm/AM" (without space)
        {
            m = Regex.Match(str, @"(?'hour'\d{2})(?'ampm'AM|am|PM|pm|Pm)", RegexOptions.Compiled);
            result = true;
            counter++;
        }

但由于某些商业原因,我必须在代码下面执行。正则表达式不应该与10PM匹配,因为下面提到了1位数限制,但它仍然与下面的正则表达式匹配。怎么避免呢?以下代码仅适用于(例如1PM)1位

 if (Regex.IsMatch(str, @"(?'hour'\d{1})(?'ampm'AM|am|PM|pm|Pm)", RegexOptions.Compiled)) // 1 digit + AM/PM without space
        {
            m = Regex.Match(str, @"(?'hour'\d{1})(?'ampm'AM|am|PM|pm|Pm)", RegexOptions.Compiled);
            result = true;
            counter++;
        }

2 个答案:

答案 0 :(得分:1)

\d{1}是无操作,因为除非另有说明,否则每个正则表达式标记只匹配一次)与0中的10匹配。如果您希望它只匹配一位数,可以使用negative lookbehind assertion

@"(?<!\d)(?'hour'\d)(?'ampm'AM|am|PM|pm|Pm)"

但整个方法很奇怪。例如,为什么不简单地使正则表达式不区分大小写(或者您是否特别想要允许Pm并禁止Am)?

此外,为什么两次匹配同一个正则表达式?

答案 1 :(得分:0)

只需在\b之前使用单词边界\d,以确保在该单个数字之前必须存在单词边界。 \b匹配单词字符和非单词字符。

@"(?'hour'\b\d)(?'ampm'(?i)[ap]m)"

(?i)[ap]m会对ampm

进行不区分大小写的匹配