Regex 用于评估日期范围的正则表达式
我有一个UNIX ls输出,必须编写正则表达式以返回日期范围大于2017-11-05的文件名 我知道regex不用于数值计算,但我使用的工具只支持模式,这就是为什么我唯一的选择是regex 示例输入如下所示: drwxrwxr-x-测试hdp_测试0 2018-02-02 05:10/raw/ADS/ClicksData/click/datetm=2017-10-15 drwxrwxr-x-测试hdp_测试0 2018-02-01 09:35/raw/ADS/ClicksData/click/datetm=2017-10-16 drwxrwxr-x-测试hdp_测试0 2018-01-31 21:54/raw/ADS/ClicksData/click/datetm=2017-10-17 drwxrwxr-x-测试hdp_测试0 2018-01-31 23:59/raw/ADS/ClicksData/click/datetm=2017-10-18 drwxrwxr-x-测试hdp_测试0 2018-01-31 21:49/raw/ADS/ClicksData/click/datetm=2017-10-19 drwxrwxr-x-测试hdp_测试0 2018-02-01 09:32/raw/ADS/ClicksData/click/datetm=2017-10-20 drwxrwxr-x-测试hdp_测试0 2018-02-02 11:51/raw/ADS/ClicksData/click/datetm=2017-10-21 drwxrwxr-x-测试hdp_测试0 2018-02-01 09:08/raw/ADS/ClicksData/click/datetm=2017-10-22 drwxrwxr-x-测试hdp_测试0 2018-01-31 22:42/raw/ADS/ClicksData/click/datetm=2017-10-23 drwxrwxr-x-测试hdp_测试0 2018-02-01 09:58/raw/ADS/ClicksData/click/datetm=2017-10-24 drwxrwxr-x-测试hdp_测试0 2018-02-02 05:10/raw/ADS/ClicksData/click/datetm=2017-10-25 drwxrwxr-x-测试hdp_测试0 2018-02-01 09:46/raw/ADS/ClicksData/click/datetm=2017-10-26 drwxrwxr-x-测试hdp_测试0 2018-02-01 09:04/raw/ADS/ClicksData/click/datetm=2017-10-27 drwxrwxr-x-测试hdp_测试0 2018-02-01 09:46/raw/ADS/ClicksData/click/datetm=2017-10-28 drwxrwxr-x-测试hdp_测试0 2018-02-02 00:21/raw/ADS/ClicksData/click/datetm=2017-10-29 drwxrwxr-x-测试hdp_测试0 2018-02-02 05:09/raw/ADS/ClicksData/click/datetm=2017-10-30 drwxrwxr-x-测试hdp_测试0 2018-02-02 05:13/raw/ADS/ClicksData/click/datetm=2017-10-31 drwxrwxr-x-测试hdp_测试0 2018-02-01 14:34/raw/ADS/ClicksData/click/datetm=2017-11-01 drwxrwxr-x-测试hdp_测试0 2018-02-02 09:20/raw/ADS/ClicksData/click/datetm=2017-11-02 drwxrwxr-x-测试hdp_测试0 2018-02-01 14:35/raw/ADS/ClicksData/click/datetm=2017-11-03 drwxrwxr-x-测试hdp_测试0 2018-02-01 09:42/raw/ADS/ClicksData/click/datetm=2017-11-04 drwxrwxr-x-测试hdp_测试0 2018-02-02 09:18/raw/ADS/ClicksData/click/datetm=2017-11-05 drwxrwxr-x-测试hdp_测试0 2018-02-01 09:11/raw/ADS/ClicksData/click/datetm=2017-11-06 drwxrwxr-x-测试hdp_测试0 2018-01-31 17:56/raw/ADS/ClicksData/click/datetm=2017-11-07 drwxrwxr-x-测试hdp_测试0 2018-01-31 21:36/raw/ADS/ClicksData/click/datetm=2017-11-08 drwxrwxr-x-测试hdp_测试0 2018-01-31 16:43/raw/ADS/ClicksData/click/datetm=2017-11-09 drwxrwxr-x-测试hdp_测试0 2018-01-31 21:59/raw/ADS/ClicksData/click/datetm=2017-11-10 drwxrwxr-x-测试hdp_测试0 2018-02-01 09:23/raw/ADS/ClicksData/click/datetm=2017-11-11 样本输出如下所示: drwxrwxr-x-testetl hdp_测试0 2018-02-01 09:11/raw/ADS/ClicksData/click/datetm=2017-11-06 drwxrwxr-x-testetl hdp_测试0 2018-01-31 17:56/raw/ADS/ClicksData/datetm=2017-11-07 drwxrwxr-x-x-testetl hdp_测试0 2018-01-31 21:36/raw/ADS/ClicksData/ClicksData/click/datetm=2017-11-08 DRWXR-x-testetl hdp_测试0 2018-01-43:43/raw/ADS/ClicksData/click/datetm=2017-11-09 drwxrwxr-x-testel hdp_test 0 2018-01-31 21:59/raw/ADS/ClicksData/click/datetm=2017-11-10 drwxrwxr-x-testel hdp_test 0 2018-02-01 09:23/raw/ADS/ClicksData/click/datetm=2017-11-11Regex 用于评估日期范围的正则表达式,regex,date,pattern-matching,range,snowflake-cloud-data-platform,Regex,Date,Pattern Matching,Range,Snowflake Cloud Data Platform,我有一个UNIX ls输出,必须编写正则表达式以返回日期范围大于2017-11-05的文件名 我知道regex不用于数值计算,但我使用的工具只支持模式,这就是为什么我唯一的选择是regex 示例输入如下所示: drwxrwxr-x-测试hdp_测试0 2018-02-02 05:10/raw/ADS/ClicksData/click/datetm=2017-10-15 drwxrwxr-x-测试hdp_测试0 2018-02-01 09:35/raw/ADS/ClicksData/click/
为了返回以2017年11月5日之后的日期结束的整行,您可以使用: 它在3种情况下匹配:
- 日期为2017年11月,从5号开始
- 日期:2017年12月
- 2018年的日期
您没有明确说明输入的正确性,因此我假设所有日期都是有效的(即不是2018-45-90)您可以试试这个,可能就是您要问的 注意,这不是日期验证。
这只是一个大于日期的验证。
验证日期。但是,我不认为这是你需要的
(?m)^.*(?:201[89]| 2\d[2-9]|[3-9]|[3}-(?:0[1-9]| 1[0-2])-(?:0[1-9]|[12]|[3[01])| 2017-(?:12-(?:0[1-9]|[12]|[12]|[12]|[3[01])11-(?:0[6-9]|[12]|[12]|[01])/01])
注意,如果将所有01-31和01-12替换为\d{2},则可以使其更短
格式化
(?m) # Multi-line mode
^ # BOL
.*
(?:
(?: # 2018 - 9999
201 [89]
| 2 \d [2-9] \d
| [3-9] \d{3}
)
-
(?: 0 [1-9] | 1 [0-2] ) # 01 - 12
-
(?: # 01 - 31
0 [1-9]
| [12] \d
| 3 [01]
)
| # OR,
2017 # 2017
-
(?:
12 - # 12
(?: # 01 - 31
0 [1-9]
| [12] \d
| 3 [01]
)
| # or,
11 - # 11
(?: # 06 - 31
0 [6-9]
| [12] \d
| 3 [01]
)
)
)
$ # EOL
缩短版本,仍然只验证大于日期的版本
(?m)^.*((?:201[8-9]| 2\d[2-9]|[3-9]|[3})-\d{2}-\d{2}2017-(?:12-\d{2}11-(?:0[6-9]|[12]|[12]| d{3[01])$
尝试使用regexp对自己来说太难了。不确定您使用的是什么工具,但我确定还有其他选择:
- 如果它与shell脚本类似,只需将输入日期转换为Unix时间戳,例如
$ date -u -d '2017-11-06' +%s
1509926400
然后你就有了一个数字,你可以很容易地和一个常数进行比较
- 另一个选项是从
2017-11-06
中删除破折号:
$ echo '2017-01-06' | tr -d '-'
20170106
同样,输出可以作为简单整数进行比较
- 如果您使用的是Snowflake(您添加了
Snowflake datawarehouse
标签),只需执行以下操作即可
你有一个可以比较的日期
顺便说一句,你提供的细节越多,你得到的答案就越好。11月有30天,而不是31天。你包括第5天,OP说的时间比第5天长。你用什么工具来完成这项任务?您提到了snowflake数据仓库-您使用的是snowflake吗?如果是的话,inp怎么样
$ echo '2017-01-06' | tr -d '-'
20170106
SELECT SUBSTR(line, -10)::date