日期区间正则表达式生成模块

功能:给定开始日期和结束日期,返回匹配该段日期区间的正则表达式。生成的正则表达式假定了每个月都有39天,即01-39,所以不要使用该模块来判断日期的合法性。该模块生成的正则表达式的使用场景是从一组合法日期中提取给定区间内的日期。源码如下,使用scala实现。

def genRegexp(start:String,end:String): String = {
        //s:开始e:结束y:年m:月d:日o:个位t:十位
        //sy:开始年em:结束月,其他变量命名规则相同
        val sy = start.substring(0, 4)
        val sm = start.substring(4, 6)
        val sd = start.substring(6, 8)
        val ey = end.substring(0, 4)
        val em = end.substring(4, 6)
        val ed = end.substring(6, 8)
        val sdo = sd.substring(1, 2)
        val sdt = sd.substring(0, 1)
        val smo = sm.substring(1, 2)
        val smt = sm.substring(0, 1)
        val syo = sy.substring(3, 4)
        val syt = sy.substring(2, 3)
        val edo = ed.substring(1, 2)
        val edt = ed.substring(0, 1)
        val emo = em.substring(1, 2)
        val emt = em.substring(0, 1)
        val eyo = ey.substring(3, 4)
        val eyt = ey.substring(2, 3)
        var PAL = ""
        var PAR = ""
        var PA = ""
        var PB = ""
        var PC = ""
        var PCL = ""
        var PCR = ""
        var pattern = ""
        var PL = ""
        var PR = ""
        var PRT = ""
        if (sy == ey) {
            if (sm == em) {
                if (sdt == edt) {
                    pattern = "(^%s%s%s[%s-%s]$)".format(sy, sm, sdt, sdo, edo)
                }
                else {
                    if (sdt.toInt + 1 == edt.toInt) {
                        pattern = "(^%s%s((%s[%s-9])|(%s[0-%s]))$)".format(sy, sm, sdt, sdo, edt, edo)
                    }
                    else {
                        pattern = "(^%s%s((%s[%s-9])|(%s[0-%s])|([%d-%d]\\d))$)".format(sy, sm, sdt, sdo,
                            edt, edo, sdt.toInt + 1, edt.toInt - 1)
                    }
                }
            }
            else {
                if (sdt == "3") {
                    PL = "(%s3[%s-9])".format(sm, sdo)
                }
                else {
                    PL = "(%s((%s[%s-9])|([%d-3]\\d)))".format(sm, sdt, sdo, sdt.toInt + 1)
                }
                if (edt == "0") {
                    PR = "(%s0[0-%s])".format(em, edo)
                }
                else {
                    PR = "(%s(([0-%d]\\d)|(%s[0-%s])))".format(em, edt.toInt - 1, edt, edo)
                }
                PRT = "(pass)"
                if (sm.toInt + 1 != em.toInt) {
                    val sma = sm.toInt + 1
                    val emr = em.toInt - 1
                    if (sma < 10) {
                        if (emr < 10) {
                            PRT = "(0[%d-%d]\\d{2})".format(sma, emr)
                        }
                        else {
                            PRT = "(((0[%d-9])|(1[0-%d]))\\d{2})".format(smo.toInt + 1, emo.toInt - 1)
                        }
                    }
                    else {
                        PRT = "((1[%s-%s])\\d{2})".format((sma.toString).substring(1,2),
                            (emr.toString).substring(1,2))
                    }
                }
                pattern = "(^%s(%s|%s|%s)$)".format(sy, PL, PR, PRT)
            }
        }
        else {
            //构造PA
            if (sdt == "3") {
                PAL = "%s(%s[%s-9])".format(sm, sdt, sdo)
            }
            else {
                PAL = "(%s((%s[%s-9])|([%d-3]\\d)))".format(sm, sdt, sdo, sdt.toInt + 1)
            }
            if (sm.toInt == 12) {
                PAR = "(pass)"
            }
            else if (sm.toInt >= 9) {
                var sm2 = (sm.toInt + 1).toString
                var smo2 = sm2.substring(1,2)
                PAR = "(1[%s-2]\\d\\d)".format(smo2)
            }
            else {
                PAR = "(((0[%d-9])|(1[0-2]))\\d{2})".format(smo.toInt + 1)
            }
            PA = "(^%s(%s|%s)$)".format(sy, PAL, PAR)
            //构造PB,已知问题,结束年不可为2000
            if (sy.toInt + 1 != ey.toInt) {
                var sy2 = (sy.toInt + 1).toString
                var syt2 = sy2.substring(2,3)
                var syo2 = sy2.substring(3,4)
                var ey2 = (ey.toInt - 1).toString
                var eyt2 = ey2.substring(2,3)
                var eyo2 = ey2.substring(3,4)
                if (syt2 == eyt2) {
                    PB = "(^20%s[%s-%s]\\d{4}$)".format(syt2, syo2, eyo2)
                }
                else {
                    if (syt2.toInt + 1 != eyt2.toInt) {
                        PB = "(^20((%s[%d-9])|([%d-%d]\\d)|(%s[0-%s]))\\d{4}$)".format(syt2, syo2.toInt,
                            syt2.toInt + 1, eyt2.toInt - 1, eyt2, eyo2)
                    }
                    else {
                        PB = "(^20((%s[%d-9])|(%s[0-%s]))\\d{4}$)".format(syt2, syo2.toInt,
                            eyt2, eyo2)
                    }
                }
            }
            else {
                PB = "(pass)"
            }
            //构造PC
            if (edt == "0") {
                PCR = "(%s%s[0-%s])".format(em, edt, edo)
            }
            else {
                PCR = "(%s(([0-%d]\\d)|(%s[0-%s])))".format(em, edt.toInt - 1, edt, edo)
            }
            if (em.toInt >= 11) {
                PCL = "(((0[1-9])|(1[0-%d]))\\d{2})".format( emo.toInt - 1)
            }
            else if (em.toInt == 10) {
                PCL = "(0[1-9]\\d{2})"
            }
            else {
                PCL = "(0[0-%d]\\d{2})".format(emo.toInt - 1)
            }
            PC = "(^%s(%s|%s)$)".format(ey, PCL, PCR)
            pattern = "%s|%s|%s".format(PA, PB, PC)
        }
        pattern
    }
时间: 2024-07-31 22:19:33

日期区间正则表达式生成模块的相关文章

传感器仿真平台——数据生成模块(三)

数据生成模块有下面这样一种情况: 对于不同的传感器仿真实验,所使用的数据类型,数据数量不一样. 如实验一是进行最大覆盖率实验,则他需要的数据格式可能是如下所示: 1 Class Sensor 2 { 3 public int x; 4 public int y; 5 public double direction; //方向 6 public double sweep;//扇形大小 7 } 实验二进行的是信号强度实验,则他可能还需要一个用来作为覆盖物的目标,如下: 1 Class Target

JS日期区间选择和计算(一)技术篇

吐槽归吐槽,工作还是不能懈怠滴,接下来说说日期选择的问题吧 首先上需求: 这个需求在后台管理里面是使用的比较频繁的,比如说在查询中:查询一周内的XXX,本月的XXX,上月的XXX等等的需求 技术解决方案: 和月份相关计算要抓住一个不变的日期,因为大家都知道每个月的天数是都不一样的,有28天,29天,30天和31天,所以要进行精确的计算就得抓住共性那就是每个月都有1号,和月份相关的计算1号这我觉得是一个关键点有了这一天你就可以随心所欲的进行日期操控 需求一:选择上个月我要显示出上个月月初和月末两个

查出在当天所处的日期区间的某些数据

现要做报表,要查出在当天所处的日期区间的某些数据 ,sql语句该怎么写? 就是说 无法直接输入日期,日期得在其他表的start date 和 end date 中获得. select * from a  where a.time between        (select b.startdate           from b b          where sysdate between startdate and enddate)    and (select b.enddate   

Python文件交互,模块与Pickle序列化,正则表达式re模块

先说点其他的. sudo       以超级权限运行命令 su         切换到root用户 sudo su    以超级权限切换到root用户 这是他们之间的区别. 文件的读取: f = file('abc.txt') 与f = open('abc.txt')方法一样. f = file('abc.txt',w)打开一个写文件,不带参数默认打开一个读文件. 模式有: r ## w ## a ## rw ## rb ## wb ## ab## f.read() 返回字符串 f.readli

验证日期的正则表达式比较全面地验证

原文:验证日期的正则表达式比较全面地验证 1.验证日期的正则表达式加入闰年的判断以及思路分析 进入正题之前,我们需要澄清两个概念: 一,什么是合法的日期范围?对于不同的应用场景,这个问题有不同的解释.这里采纳MSDN中的约定: DateTime 值类型表示值范围在公元(基督纪元)0001 年 1 月 1 日午夜 12:00:00 到公元 (C.E.) 9999 年 12 月 31 日晚上 11:59:59 之间的日期和时间. 二,关于闰年的阐释.人民教育出版社小学数学室的解释浅明易懂(media

apache 单独生成模块

apache 单独生成模块 一般这种模块都是后期自己去生成的,比如一般在安装apache时都会--enable-so  ,允许动态加载模块. 这个模块你可以这样去生成. 1.下载一个与当前使用的apache一样版本的安装包. 2.解压安装包,然后进入其目录#cd /tmp/httpd-2.2.11/modules/mappers/#ls   ,此目录有个mod_speling.c文件 3.生成模块/usr/local/apache/bin/apxs -c -i -a mod_speling.c

thinkphp3.2自动生成模块BIND_MODULE

thinphp3.2中提供了自定义生成模块与控制器的常量,分别是BIND_MODULE,BUILD_CONTROLLER_LIST 在 index.php 文件中定义 BIND_MODULE,BUILD_CONTROLLER_LIST 常量 1 2 3 4 5 6 7 8 9 10 11 // 开启调试模式 建议开发阶段开启 部署阶段注释或者设为false define('APP_DEBUG',True); // 定义应用目录 define('APP_PATH','./App/'); // 自动

Sql 获取日期区间

获取制定日期区间 declare @d as date declare @d2 as date set @d = '2014-06-03' set @d2 ='2014-06-10' select convert(varchar(10),dateadd(dd,number,@d)) as dt ,dateadd(dd,-1,convert(varchar(8),dateadd(mm,1,@d),120)+'01') from master..spt_values where type='P' a

python datatime日期和时间值模块

datetime.time():是一个时间类,这个类接受4个参数,分别代表时,分,秒,毫秒.参数的默认值是为0 1 #!/usr/bin/env python 2 #coding:utf8 3 import datetime 4 t=datetime.time(20, 00, 13, 00) 5 print t 6 print '*'*20 7 print t.hour 8 print t.minute 9 print t.second 10 print t.microsecond 11 12