我有一个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
答案 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种情况:
你没有具体说明输入的正确性,所以我假设所有日期都有效(即不是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}}
答案 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
你有一个可以比较的日期
顺便说一下,你提供的细节越多,你得到的答案就越好。