10月15日09:00到10月23日11:00匹配的正则表达式?

时间:2014-11-13 16:39:21

标签: regex

我需要使用以下数据格式匹配的正则表达式(10月15日09:00至10月23日11:00):

Wed Oct 22 18:26:09 BST 2014 => Match
Wed Oct 21 09:26:09 BST 2014 => Match
Wed Oct 14 11:00:09 BST 2014
Wed Oct 01 23:26:09 BST 2014
Wed Oct 28 18:26:09 BST 2014
Wed Oct 23 08:26:09 BST 2014 => Match
Wed Oct 13 18:26:09 BST 2014
Wed Oct 01 18:26:09 BST 2014

有人可以帮忙吗?我在Hadoop上使用PigLatin,但它使用Java Regex系统。

3 个答案:

答案 0 :(得分:2)

处理数字范围在正则表达式模式中并不方便,但是如果你照顾正则表达式引擎将遵循的路径,它可以以有效的方式完成。例如,在以下模式中,当正则表达式引擎在分支中成功时,您可以确定它在另一个分支中无法成功(这是模式的构建方式)。因此,即使模式看起来很长,它也会为正则表达式引擎提供更短的成功或失败方式:

online demo

紧凑版:

Oct (?>1(?:[6-9] [0-9]{2}:[0-9]{2}:[0-9]{2}|5 (?:[12][0-9]|09):[0-9]{2}:[0-9]{2})|2(?:[0-2] [0-9]{2}:[0-9]{2}:[0-9]{2}|3 (?:(?:0[0-9]|10):[0-9]{2}:[0-9]{2}|11:00:00))) BST 2014

可读版本:

Oct\ 
(?>
    1
    (?:
        [6-9] \ [0-9]{2}:[0-9]{2}:[0-9]{2}
      |
        5 \ (?: [12][0-9] | 09 ) : [0-9]{2} : [0-9]{2}
    )
  |
    2
    (?:
        [0-2] \ [0-9]{2}:[0-9]{2}:[0-9]{2}
      |
        3 \ 
        (?:
            (?:0[0-9]|10):[0-9]{2}:[0-9]{2}
          |
            11:00:00
        )
    )
)
\ BST\ 2014

答案 1 :(得分:1)

虽然将字符串转换为日期然后使用值比较可能会更好,但如果你真的想这样做:

Oct\s(1[6-9] |2[012] |15 (09|[12])|23 (0|10|11:00:00))[:\d]+

这里是demo

如果您希望匹配在10月25日11:00:00而不是23:

停止
Oct\s(1[6-9] |2[0-4] |15 (09|[12])|25 (0|10|11:00:00))[:\d]+

enter link description here

答案 2 :(得分:0)

正如Sean已经指出的那样,这并不是Regexes的优点所在,但假设你仍然想要在下面做,那就是一个适合你的正则表达式。

^\w+\sOct\s(?:(15)|16|17|18|19|20|21|22|(23))\s(?(1)(?:09|[12]\d):.+|(?(2)(?:(?:11|10)|0\d):.+|.+))$

Regex Demo

您没有指定您正在使用的语言或Regex引擎,因此我尝试将其设为通用语言。

为了达到有效的原因,我假设您了解使用正则表达式的基础知识。

^                                   -- Beginning character anchor
\w+\sOct\s                          -- This grabs the 'Wed Oct ' piece
(?:(15)|16|17|18|19|20|21|22|(23))  -- This is the list of days supported (notice I capture the 15th and 23rd. Very important for the next part
\s
(?(1)                               -- this is a conditional statement, if group 1 matched, then do this else do this
 (?:09|[12]\d):.+                   -- so if it's the 15th, check to see if the time is greater than or equal to 9am
 |                                  -- ELSE
 (?(2)                              -- if it's the 23, check to see if it's before 11am
   (?:(?:11|10)|0\d):.+
 |
 .+)                                --otherwise, we don't care what time it is
)$