【问题标题】:Finding time through regex通过正则表达式查找时间
【发布时间】:2015-01-10 14:51:16
【问题描述】:

我需要从给定文本中查找检索时间,例如今晚加入我们共进晚餐,直到晚上 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++;
        }

但由于某些业务原因,我也必须执行以下代码。正则表达式不应该匹配晚上 10 点,因为下面提到了 1 位限制,但它仍然与下面的正则表达式匹配。如何避免呢?以下代码仅适用于(例如下午 1 点)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++;
        }

【问题讨论】:

    标签: regex


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 它工作了.. 任何类型的 AM 或 Pm 都可以(任何建议使 AM PM 不区分大小写?)如果文本有多次提及,那么我必须避免那些因此我保留如果用计数器声明。任何建议都会很有帮助
    • 您可以使用内联 i 修饰符。 (?&lt;!\d)(?'hour'\d)(?'ampm'(?i)[ap]m)
    • 好的,非常感谢。最后需要帮助 @"(?
    • @user1037747:最好的可能是使用word boundary anchor@"(?&lt;!\d)(?'hour'\d)h\b"
    【解决方案2】:

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

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

    (?i)[ap]m 将不区分大小写匹配 ampm

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-01-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-29
      • 2015-04-11
      • 2017-08-03
      • 2019-07-26
      相关资源
      最近更新 更多