我需要使用以下数据格式匹配的正则表达式(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系统。
答案 0 :(得分:2)
处理数字范围在正则表达式模式中并不方便,但是如果你照顾正则表达式引擎将遵循的路径,它可以以有效的方式完成。例如,在以下模式中,当正则表达式引擎在分支中成功时,您可以确定它在另一个分支中无法成功(这是模式的构建方式)。因此,即使模式看起来很长,它也会为正则表达式引擎提供更短的成功或失败方式:
紧凑版:
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]+
答案 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引擎,因此我尝试将其设为通用语言。
为了达到有效的原因,我假设您了解使用正则表达式的基础知识。
^ -- 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
)$