正则表达式评估日期范围

时间:2018-02-20 18:00:42

标签: regex date pattern-matching range snowflake-datawarehouse

我有一个UNIX ls输出,必须写一个正则表达式来返回大于2017-11-05的日期范围的文件名。

我知道正则表达式不是用于数值评估,而是我使用的工具只支持模式,这就是为什么我唯一的选择是正则表达式。

示例输入如下:

https://regex101.com/r/shFymy/2

  

drwxrwxr-x - testetl hdp_test 0 2018-02-02 05:10 / raw / ADS / ClicksData / click / datetm = 2017-10-15   drwxrwxr-x - testetl hdp_test 0 2018-02-01 09:35 / raw / ADS / ClicksData / click / datetm = 2017-10-16   drwxrwxr-x - testetl hdp_test 0 2018-01-31 21:54 / raw / ADS / ClicksData / click / datetm = 2017-10-17   drwxrwxr-x - testetl hdp_test 0 2018-01-31 23:59 / raw / ADS / ClicksData / click / datetm = 2017-10-18   drwxrwxr-x - testetl hdp_test 0 2018-01-31 21:49 / raw / ADS / ClicksData / click / datetm = 2017-10-19   drwxrwxr-x - testetl hdp_test 0 2018-02-01 09:32 / raw / ADS / ClicksData / click / datetm = 2017-10-20   drwxrwxr-x - testetl hdp_test 0 2018-02-02 11:51 / raw / ADS / ClicksData / click / datetm = 2017-10-21   drwxrwxr-x - testetl hdp_test 0 2018-02-01 09:08 / raw / ADS / ClicksData / click / datetm = 2017-10-22   drwxrwxr-x - testetl hdp_test 0 2018-01-31 22:42 / raw / ADS / ClicksData / click / datetm = 2017-10-23   drwxrwxr-x - testetl hdp_test 0 2018-02-01 09:58 / raw / ADS / ClicksData / click / datetm = 2017-10-24   drwxrwxr-x - testetl hdp_test 0 2018-02-02 05:10 / raw / ADS / ClicksData / click / datetm = 2017-10-25   drwxrwxr-x - testetl hdp_test 0 2018-02-01 09:46 / raw / ADS / ClicksData / click / datetm = 2017-10-26   drwxrwxr-x - testetl hdp_test 0 2018-02-01 09:04 / raw / ADS / ClicksData / click / datetm = 2017-10-27   drwxrwxr-x - testetl hdp_test 0 2018-02-01 09:46 / raw / ADS / ClicksData / click / datetm = 2017-10-28   drwxrwxr-x - testetl hdp_test 0 2018-02-02 00:21 / raw / ADS / ClicksData / click / datetm = 2017-10-29   drwxrwxr-x - testetl hdp_test 0 2018-02-02 05:09 / raw / ADS / ClicksData / click / datetm = 2017-10-30   drwxrwxr-x - testetl hdp_test 0 2018-02-02 05:13 / raw / ADS / ClicksData / click / datetm = 2017-10-31   drwxrwxr-x - testetl hdp_test 0 2018-02-01 14:34 / raw / ADS / ClicksData / click / datetm = 2017-11-01   drwxrwxr-x - testetl hdp_test 0 2018-02-02 09:20 / raw / ADS / ClicksData / click / datetm = 2017-11-02   drwxrwxr-x - testetl hdp_test 0 2018-02-01 14:35 / raw / ADS / ClicksData / click / datetm = 2017-11-03   drwxrwxr-x - testetl hdp_test 0 2018-02-01 09:42 / raw / ADS / ClicksData / click / datetm = 2017-11-04   drwxrwxr-x - testetl hdp_test 0 2018-02-02 09:18 / raw / ADS / ClicksData / click / datetm = 2017-11-05   drwxrwxr-x - testetl hdp_test 0 2018-02-01 09:11 / raw / ADS / ClicksData / click / datetm = 2017-11-06   drwxrwxr-x - testetl hdp_test 0 2018-01-31 17:56 / raw / ADS / ClicksData / click / datetm = 2017-11-07   drwxrwxr-x - testetl hdp_test 0 2018-01-31 21:36 / raw / ADS / ClicksData / click / datetm = 2017-11-08   drwxrwxr-x - testetl hdp_test 0 2018-01-31 16:43 / raw / ADS / ClicksData / click / datetm = 2017-11-09   drwxrwxr-x - testetl hdp_test 0 2018-01-31 21:59 / raw / ADS / ClicksData / click / datetm = 2017-11-10   drwxrwxr-x - testetl hdp_test 0 2018-02-01 09:23 / raw / ADS / ClicksData / click / datetm = 2017-11-11

示例输出如下:

  

drwxrwxr-x - testetl hdp_test 0 2018-02-01 09:11 / raw / ADS / ClicksData / click / datetm = 2017-11-06 drwxrwxr-x - testetl hdp_test 0 2018-01-31 17:56 / raw / ADS / ClicksData / click / datetm = 2017-11-07 drwxrwxr-x - testetl hdp_test 0 2018-01-31 21:36 / raw / ADS / ClicksData / click / datetm = 2017-11-08 drwxrwxr-x - testetl hdp_test 0 2018-01-31 16:43 / raw / ADS / ClicksData / click / datetm = 2017-11-09 drwxrwxr-x - testetl hdp_test 0 2018-01-31 21:59 / raw / ADS / ClicksData / click / datetm = 2017-11-10 drwxrwxr-x - testetl hdp_test 0 2018-02-01 09:23 / raw / ADS / ClicksData / click / datetm = 2017-11-11

3 个答案:

答案 0 :(得分:1)

为了返回以2017年11月5日之后的日期结束的整行,您可以使用this regex

^.*=(?:2017-(?:11-(?:0[6-9]|[12][0-9]|30)|12-\d{2})|2018-\d{2}-\d{2})

匹配3种情况:

  • 2017年11月的日期,从5日开始,进一步
  • 2017年12月的日期
  • 2018年的日期

你没有具体说明输入的正确性,所以我假设所有日期都有效(即不是2018-45-90

答案 1 :(得分:1)

你可以尝试这个,可能就是你所要求的。

请注意,这不是日期验证 这只是一个大于日期验证 需要更多强烈的正则表达式(包括闰年) 验证日期。但是,我不认为这是你需要的。

https://regex101.com/r/AE0g7o/1

(?m)^.*(?:(?:201[8-9]|2\d[2-9]\d|[3-9]\d{3})-\d{2}-\d{2}|2017-(?:12-\d{2}|11-(?:0[6-9]|[12]\d|3[01])))$

注意,如果用\ d {2}

替换所有01 - 31和01 - 12,可以缩短它

格式化

{{1}}

缩短版本,仍然只验证大于日期

{{1}}

https://regex101.com/r/wtL0Hx/1

答案 2 :(得分:0)

你试图使用正则表达式让自己太难了。不确定你正在使用什么工具,但我确定还有其他选择:

  • 如果它类似于shell脚本,只需将输入日期转换为Unix时间戳,例如

    $ date -u -d '2017-11-06' +%s
    1509926400
    

    然后你有一个数字,你可以很容易地与常数

  • 进行比较
  • 另一个选项,从2017-11-06删除破折号:

    $ echo '2017-01-06' | tr -d '-'
    20170106
    

    同样,输出与简单整数

  • 相当
  • 如果您使用Snowflake(您添加了snowflake-datawarehouse标签),请执行

    SELECT SUBSTR(line, -10)::date 
    

    你有一个可以比较的日期

顺便说一下,你提供的细节越多,你得到的答案就越好。