ColdFusion中dd-mmm-yy日期格式的正则表达式

时间:2014-03-26 12:15:47

标签: regex coldfusion coldfusion-9

我想确保用户上传csv的日期格式为dd-mmm-yy(10-Feb-14)。我做了我的研究,我可以看到没有一个ColdFusion日期函数帮助我解决这个问题。

我可以使用IsValid函数进行正则表达式验证。我不擅长写正则表达式。感谢您的帮助。

4 个答案:

答案 0 :(得分:0)

以下是一个快速示例,说明如何通过分离的闰年检查来实现...

<cffunction name="isCorrectDateFormat" returntype="Boolean" output=false >
    <cfargument name="Input" type="String" />
    <cfscript>
        var Months30 = "Jan|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec";
        var Months31 = "Jan|Mar|May|Jul|Aug|Oct|Dec";

        var DatePattern = "(?i)(?:[1-9]|[12][0-9])-(?:#Months30#|Feb)-\d\d|30-(?:#Months30#)-\d\d|31-(?:#Months31#)-\d\d";

        return Arguments.Input.matches(DatePattern)
            AND ( left(Input,6) EQ '29-Feb' IMP isLeapYear('20'&right(Arguments.Input,2)) )
            ;
    </cfscript>
</cffunction>

这并不完美(具体而言,你可能需要更高级的逻辑而不是以20作为年份的前缀),但它会让你进入球场。

感兴趣的是IMP Implication operator - 其中“IMP b”表示“如果a为假,则返回true。如果a为真,则返回b”,因此是进行闰年检查的一种方式只有在需要的时候。

正则表达式本身可以按如下方式细分:

(?ix) ## i flag enables case-insensitive, x enables comment-mode

    ## match 1-9 or 10-29 days for every month (leap years dealt with separately)
    (?:[1-9]|[12][0-9])-(?:Jan|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec|Feb)-\d\d
|
    ## or match 30 days for all except Feb
    30-(?:Jan|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)-\d\d
|
    ## or match 31 days for relevant months
    31-(?:Jan|Mar|May|Jul|Aug|Oct|Dec)-\d\d

对于四位数年份,每个年份的最终\d\d可以是\d\d\d\d\d{4},也可以是(?:19\d\d|2[01]\d\d),具体取决于所涉及的具体日期范围。

答案 1 :(得分:0)

根据Peter的评论,我修改了我的代码..我使用了一个简单的正则表达式,然后在另一个验证中小心休息。

<cfset mydate = "31-Apr-12" />
<cfset flag = isValid("regular_expression", Ucase(mydate), "^(([0-9])|([0-2][0-9])|([3][0-1]))\-(JAN|FEB|MAR|APR|MAY|JUN|JUL|AUG|SEP|OCT|NOV|DEC)\-\d{2}$") />

<cfset aplhaMonths = "APR,JUN,SEP,NOV">
<cfif flag>
<cfif ListGetAt(mydate,1,"-") EQ 31 AND ListFindNocase(aplhaMonths, ListGetAt(mydate,2,"-")) >
<cfset flag = false />
<cfelseif ListGetAt(mydate,1,"-") GT 29 AND ListGetAt(mydate,2,"-") EQ "FEB">
<cfset flag = false />
<cfelseif ListGetAt(mydate,1,"-") EQ 29 AND ListGetAt(mydate,2,"-") EQ "FEB" AND NOT IsLeapYear(mydate)>
<cfset flag = false />
</cfif>
</cfif>

答案 2 :(得分:0)

使用正则表达式 for date =&#34; ^ \ d \ d \ d \ d-(0 [1-9] | 1 [0-2]) - ([0] [1-9] | [12] [0-9 ] | 3 [01])$&#34;  for datetime =&#34; ^ \ d \ d \ d \ d-(0 [1-9] | 1 [0-2]) - ([0] [1-9] | [12] [0-9 ] | 3 [01])(00 | [0] [0-9] | 1 [0-9] | 2 [0-3]):( [0] [0-9] | [0-5] [ 0-9]):([0] [0-9] | [0-5] [0-9])$&#34;

它将严格遵循YYYY-mm-dd,它将不允许yy-mm-dd或yyyy-m-dd oryyyy-mm-d或dd-mm-yyyy。 它不允许h:m:sor h:mm:s或hh:mm:s它只允许(YYYY-MM-DD HH:mm:ss)

答案 3 :(得分:-1)

如果您需要特定的日期格式,例如((YYYY-MM-DD) or (YYYY-MM-DD HH:mm:ss))

  1. 不应该允许2017-1-2
  2. 它也不应该允许9:9:9时间格式

    f(arguments.preparedInput.printFileLastModifiedMin neq“”或arguments.preparedInput.printFileLastModifiedMax neq“”){                 local.validMinDateFlag =“是”;                 local.validMaxDateFlag =“是”;

                if (arguments.preparedInput.printFileLastModifiedMin neq "")
                    local.validMinDateFlag = isValid ("regex", arguments.preparedInput.printFileLastModifiedMin, "^\d\d\d\d-(0[1-9]|1[0-2])-([0][1-9]|[12][0-9]|3[01])$");
    
                if (arguments.preparedInput.printFileLastModifiedMax neq "")
                    local.validMaxDateFlag = isValid ("regex",arguments.preparedInput.printFileLastModifiedMax, "^\d\d\d\d-(0[1-9]|1[0-2])-([0][1-9]|[12][0-9]|3[01])$");
    
                if (local.validMaxDateFlag eq "NO" or local.validMinDateFlag eq "NO"){
                    if (local.validMinDateFlag eq "NO")
                        local.validMinDateFlag = isValid ("regex",arguments.preparedInput.printFileLastModifiedMin, "^\d\d\d\d-(0[1-9]|1[0-2])-([0][1-9]|[12][0-9]|3[01]) (00|[0][0-9]|1[0-9]|2[0-3]):([0][0-9]|[0-5][0-9]):([0][0-9]|[0-5][0-9])$");
    
                    if (local.validMaxDateFlag eq "NO")
                        local.validMaxDateFlag = isValid ("regex",arguments.preparedInput.printFileLastModifiedMax, "^\d\d\d\d-(0[1-9]|1[0-2])-([0][1-9]|[12][0-9]|3[01]) (00|[0][0-9]|1[0-9]|2[0-3]):([0][0-9]|[0-5][0-9]):([0][0-9]|[0-5][0-9])$");
                }