有没有人知道英国日期格式的reg表达式

时间:2010-09-22 08:44:12

标签: regex

嗨,有没有人知道英国日期格式的注册表例如日/月/年。

dd或mm可以是1个字符,例如2010年1月1日,但年份必须始终为4个字符。

提前致谢

7 个答案:

答案 0 :(得分:11)

^\d{1,2}/\d{1,2}/\d{4}$

将匹配1/1 / 2000,07 / 05/1999,但也匹配99/77/8765。

因此,如果您想进行一些基本的合理性检查,则需要

^(0?[1-9]|[12][0-9]|3[01])/(0?[1-9]|1[012])/\d{4}$

这仍然会与31/02/9999相匹配,所以如果你想抓住它们,它会变得更加毛茸茸:

^(?:(?:[12][0-9]|0?[1-9])/0?2|(?:30|[12][0-9]|0?[1-9])/(?:0?[469]|11)|(?:3[01]|[12][0-9]|0?[1-9])/(?:0?[13578]|1[02]))/\d{4}$

但这仍然不会闰年。因此,修改a beast of a regex from regexlib.com

^(?:(?:(?:(?:31\/(?:0?[13578]|1[02]))|(?:(?:29|30)\/(?:0?[13-9]|1[0-2])))\/(?:1[6-9]|[2-9]\d)\d{2})|(?:29\/0?2\/(?:(?:(1[6-9]|[2-9]\d)(?:0[48]|[2468][048]|[13579][26])|(?:(?:16|[2468][048]|[3579][26])00))))|(?:0?[1-9]|1\d|2[0-8])\/(?:(?:0?[1-9])|(?:1[0-2]))\/(?:(?:1[6-9]|[2-9]\d)\d{2}))$

将匹配

1/1/2001
31/5/2010
29/02/2000
29/2/2400
23/5/1671
01/1/9000

并失败

31/2/2000
31/6/1800
12/12/90
29/2/2100
33/3/3333

总而言之,正则表达式可以匹配日期;验证它们不是他们的强项,但如果它们都是你可以使用的,那肯定是可能的。但看起来很恐怖:)

答案 1 :(得分:4)

正则表达不适合这项工作。

很难(但可能)提出正则表达式以匹配有效日期。确保2月在闰年上有29天这样的事情在正则表达式中不容易实现。

而是检查您的语言库是否提供了验证日期的任何功能。

PHP有一个名为checkdate的函数:

bool checkdate  ( int $month  , int $day  , int $year)

答案 2 :(得分:1)

\b(0?[1-9]|[12][0-9]|3[01])[/](0?[1-9]|1[012])[/](19|20)?[0-9]{2}\b

匹配:

  • 1/1/2010
  • 01/01/2010

但也是无效日期,例如2月31日

答案 3 :(得分:0)

^\d{1,2}/\d{1,2}/\d{4}$

在大括号中有最小和最大字数。 \d表示数字,^开头,$字符串结尾。

答案 4 :(得分:0)

\b(0[1-9]|[12][0-9]|3[01])[- /.](0[1-9]|1[012])[- /.](19|20)\d\d

这不会验证日期,但您可以检查格式

答案 5 :(得分:0)

我遇到了类似的要求。 这是完整的正则表达式以及闰年验证。 格式:dd / MM / yyyy

(3 [01] | [12] \ d | 0 [1-9])/(0 [13578] | 10 | 12)/((?0000)\ d {4})|(30 | [12] \ d | 0 [1-9])/(0 [469] | 11)/((?0000)\ d {4})|(2 [0-8] | [01] \ d | 0 [1-9])/(02)/((?0000)\ d {4})| 29 /(02)/(1600 | 2000 | 2400 | 2800 | 00)| 29 /(02)/(\ d \ d)(0 [48] | [2468] [048] | [13579] [26])

可以轻松修改为美国格式或其他欧盟格式。

<强>编辑:

(3 [01] | [12] \ d | 0 [1-9])/(0 [13578] | 10 | 12)/((?0000)\ d {4})|(30 | [12] \ d | 0 [1-9])/(0 [469] | 11)/((?0000)\ d {4})|(2 [0-8] | [01] \ d | 0 [1-9])/(02)/((?0000)\ d {4})| 29 /(02)/(1600 | 2000 | 2400 | 2800 | 00)| 29 /(02)/( \ d \ d)(0 [48] | [2468] [048] | [13579] [26])

答案 6 :(得分:0)

您想要做两件事,我认为最好单独考虑

1)您想确保日期是真实的实际日期。 例如,2019-02-29不是真实日期,而2020-02-29是真实日期,因为2020年是闰年

2)你想检查日期的格式是否正确(所以dd / mm / yyyy)

第二点可以通过简单的RegEx轻松完成,其中有很多例子。

更复杂的是,如果你问Firefox 2019-02-29是真实的日期,它会返回NaN,这是你所期望的。

另一方面,Chrome会说这是一个真实的约会并且会在2019年3月1日回复 - 这将验证

Chrome也会因为某些奇怪的原因也接受一位数字作为正确的日期,将其输入“2”并且它将从2001年开始给你完整的日期 - 这将验证

所以第一步是创建一个试图破译日期的函数(无论格式如何)并跨浏览器工作以返回指示日期是否有效的布尔值

function validatableDate(value) 
{
    Date.prototype.isValid = function() 
    {   // An invalid date object returns NaN for getTime() and NaN is the only
        // object not strictly equal to itself.
        return this.getTime() === this.getTime();
    };
    minTwoDigits = function(n) 
    {   //pads any digit less than 10 with a leading 0
        return (parseInt(n) < 10 ? '0' : '') + parseInt(n);
    }
    var valid_date = false;
    var iso_array = null;
    // check if there are date dividers (gets around chrome allowing single digit numbers)
    if ((value.indexOf('/') != -1) || (value.indexOf('-') != -1)) { //if we're dealing with - dividers we'll do some pre-processing and swap them out for /
        if (value.indexOf('-') != -1) {
            dash_parts = value.split('-');
            value = dash_parts.join("/");
            //if we have a leading year, we'll put it at the end and work things out from there
            if (dash_parts[0].length > 2) {
                value = dash_parts[1] + '/' + dash_parts[2] + '/' + dash_parts[0];
            }
        }

        parts = value.split('/');
        if (parts[0] > 12) { //convert to ISO from UK dd/mm/yyyy format
            iso_array = [parts[2], minTwoDigits(parts[1]), minTwoDigits(parts[0])]
        } else if (parts[1] > 12) { //convert to ISO from American mm/dd/yyyy format                                                
            iso_array = [parts[2], minTwoDigits(parts[0]), minTwoDigits(parts[1])]
        } else //if a date is valid in either UK or US (e.g. 12/12/2017 , 10/10/2017) then we don't particularly care what format it is in - it's valid regardless
        {
            iso_array = [parts[2], minTwoDigits(parts[0]), minTwoDigits(parts[1])]
        }

        if (Array.isArray(iso_array)) {
            value = iso_array.join("-");
            var d = new Date(value + 'T00:00:01Z');
            if (d.isValid()) //test if it is a valid date (there are issues with this in Chrome with Feb)
            {
                valid_date = true;
            }
            //if the month is Feb we need to do another step to cope with Chrome peculiarities
            if (parseInt(iso_array[1]) == 2) {
                month_info = new Date(iso_array[0], iso_array[1], 0);
                //if the day inputed is larger than the last day of the February in that year
                if (iso_array[2] > month_info.getDate()) {
                    valid_date = false;
                }
            }
        }
    }
    return valid_date;
}

可以压缩到

function validatableDate(t) {
    Date.prototype.isValid = function () {
        return this.getTime() === this.getTime()
    }, minTwoDigits = function (t) {
        return (parseInt(t) < 10 ? "0" : "") + parseInt(t)
    };
    var a = !1,
        i = null;
    return -1 == t.indexOf("/") && -1 == t.indexOf("-") || (-1 != t.indexOf("-") && (dash_parts = t.split("-"), t = dash_parts.join("/"), dash_parts[0].length > 2 && (t = dash_parts[1] + "/" + dash_parts[2] + "/" + dash_parts[0])), parts = t.split("/"), i = parts[0] > 12 ? [parts[2], minTwoDigits(parts[1]), minTwoDigits(parts[0])] : (parts[1], [parts[2], minTwoDigits(parts[0]), minTwoDigits(parts[1])]), Array.isArray(i) && (t = i.join("-"), new Date(t + "T00:00:01Z").isValid() && (a = !0), 2 == parseInt(i[1]) && (month_info = new Date(i[0], i[1], 0), i[2] > month_info.getDate() && (a = !1)))), a
}

这会让你进行跨浏览器测试,看看是否可以验证日期,并且它会读取&amp;以格式解密日期

  • YYYY-MM-DD
  • DD-MM-YYYY
  • MM-DD-YYYY
  • 日/月/年
  • 毫米/日/年

一旦您验证了日期是真实的,正确的,您可以使用正则表达式测试格式。所以对于UK dd / mm / yy

function dateUK(value) {
    valid_uk_date=false;
    valid_date=validatableDate(value);
    if(valid_date && value.match(/^(0?[1-9]|[12][0-9]|3[01])[\/](0?[1-9]|1[012])[\/]\d{4}$/))
    {   valid_uk_date=true;
    }
    return  valid_uk_date;              
}

然后您知道日期是真实的,并且格式正确。

对于yyyy-mm-dd格式,您可以:

function dateISO(value) {
    valid_iso_date=false;
    valid_date=validatableDate(value);
    if(valid_date && value.match(/^\d{4}[\/\-]\d{1,2}[\/\-]\d{1,2}$/))
    {   valid_iso_date=true;
    }
    return  valid_iso_date;             
}

这取决于您想要多么彻底,对于格式理智的粗略检查,RegEx可能足以满足您的目的。但是,如果您想测试日期是否真实,并且格式是否有效,那么这将有助于指导您一路走来

由于