Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 用于评估日期范围的正则表达式_Regex_Date_Pattern Matching_Range_Snowflake Cloud Data Platform - Fatal编程技术网

Regex 用于评估日期范围的正则表达式

Regex 用于评估日期范围的正则表达式,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/

我有一个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-11


为了返回以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