免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 10053 | 回复: 13
打印 上一主题 下一主题

Perl正则匹配时间,求大虾帮忙 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2013-08-17 21:38 |只看该作者 |倒序浏览
现在有1张表的数据每个都是都是以时间类似2013-7-4这样的形式索引,但是每次我只希望抓取我指定时间,比如当前我需要2013-9-28到2013-10-03时间段的,如何用正则表达式判断数据的时间是不是在需要的范围内,求大侠写段Perl程序帮忙。谢谢!

论坛徽章:
0
2 [报告]
发表于 2013-08-17 23:23 |只看该作者
本帖最后由 范闲丶 于 2013-08-18 02:24 编辑

#!/usr/bin/perl
while (<DATA>) {
if(/2013-10-[0][123]|2013-9-[23][890]/){
print "OK\n";
}
else{
        print "No!\n";
}
}

__DATA__
2013-9-25
2013-9-26
2013-9-27
2013-9-28
2013-9-29
2013-9-30
2013-10-01
2013-10-02
2013-10-03
2013-10-04
2013-10-05

结果
No!
No!
No!
OK
OK
OK
OK
OK
OK
No!
No!

论坛徽章:
0
3 [报告]
发表于 2013-08-18 11:13 |只看该作者
本帖最后由 范闲丶 于 2013-08-18 11:21 编辑

昨天这样写感觉有点问题:一是程序不灵活,二是是有错误,比如2013-9-20没排除,所以重新写了一个
#!/usr/bin/perl
while (<DATA>) {
if(/[0-9]{4}-[0-9]{1,2}-[0-9]{2}/){
        $min_date="2013-9-28";
        $max_date="2013-10-03";
        print "$_" if(&com_date($&,$min_date)>=0&&&com_date($&,$max_date)<=0);
}
}
sub com_date
{
        @d0=split /-/,$_[0];
        @d1=split /-/,$_[1];
        for($i=0;$i<3;$i++)
        {
                next if($d0[$i] eq $d1[$i]);
          return $d0[$i]-$d1[$i];
        }
}
__DATA__
2013-9-25
2013-9-26
2013-9-27
2013-9-28
2013-9-29
2013-9-30
2013-10-01
2013-10-02
2013-10-03
2013-10-04
2013-10-05
21sasdasda

结果
2013-9-28
2013-9-29
2013-9-30
2013-10-01
2013-10-02
2013-10-03

论坛徽章:
1
15-16赛季CBA联赛之北控
日期:2016-08-05 14:22:52
4 [报告]
发表于 2013-08-18 11:14 |只看该作者
这个应该会匹配到2013-09-20吧,回复 2# 范闲丶


   

论坛徽章:
1
15-16赛季CBA联赛之北控
日期:2016-08-05 14:22:52
5 [报告]
发表于 2013-08-18 11:16 |只看该作者
碰上了,回复 3# 范闲丶


   

论坛徽章:
0
6 [报告]
发表于 2013-08-18 11:22 |只看该作者
回复 5# 唐归来


    恩,我刚刚修改了代码,你看看三楼的吧,其实刚三楼也有个问题不过我检测出来了,呵呵

论坛徽章:
0
7 [报告]
发表于 2013-08-19 11:28 |只看该作者
谢谢!回复 6# 范闲丶


   

论坛徽章:
3
CU十二周年纪念徽章
日期:2013-10-24 15:41:34子鼠
日期:2013-12-14 14:57:19射手座
日期:2014-04-25 21:23:23
8 [报告]
发表于 2013-08-19 16:21 |只看该作者
  1. 2013-(?:10-0?[1-3]|0?9-(?:2[89]|30))$
复制代码

论坛徽章:
0
9 [报告]
发表于 2013-08-27 23:18 |只看该作者
回复 3# 范闲丶

为什么我把时间改成2013/9/28这种格式并把代码相应地方改成“/”,就不行了呢?

while (<DATA>) {
if(/[0-9]{4}-[0-9]{1,2}-[0-9]{2}/){
         $min_date="2013/9/28";
         $max_date="2013/10/3";
         print "$_" if(&com_date($&,$min_date)>=0 and &com_date($&,$max_date)<=0);
}
}
sub com_date
{
         @d0=split /\//,$_[0];
         @d1=split /\//,$_[1];
         for($i=0;$i<3;$i++)
         {
                 next if($d0[$i] eq $d1[$i]);
           return $d0[$i]-$d1[$i];
         }
}
__DATA__
2013-9-25
2013-9-26
2013-9-27
2013-9-28
2013-9-29
2013-9-30
2013-10-01
2013-10-02
2013-10-03
2013-10-04
2013-10-05

论坛徽章:
0
10 [报告]
发表于 2013-08-28 19:22 |只看该作者
回复 9# feiying00917
你要把你if 匹配的格式也要更该成 “/”

   
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP