Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/458.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
Javascript 正则表达式在JS中无法正常工作_Javascript_Regex - Fatal编程技术网

Javascript 正则表达式在JS中无法正常工作

Javascript 正则表达式在JS中无法正常工作,javascript,regex,Javascript,Regex,我想用这个正则表达式为特定的日期格式(与date.parse-NaN不兼容)提供一个简单的捕获和测试程序: /(\d{1,2})\/(\d{1,2})\/(\d{2,4})/ //day/month/year 它在红细胞测试仪上工作,但在铬中使用它会产生奇怪的结果: dateRegex.test("19111/7/1992") > true "19111/7/1992".match(dateRegex) //Wrong on purpose > ["11/7/1992", "11"

我想用这个正则表达式为特定的日期格式(与date.parse-NaN不兼容)提供一个简单的捕获和测试程序:

/(\d{1,2})\/(\d{1,2})\/(\d{2,4})/ //day/month/year
它在红细胞测试仪上工作,但在铬中使用它会产生奇怪的结果:

dateRegex.test("19111/7/1992")
> true
"19111/7/1992".match(dateRegex) //Wrong on purpose
> ["11/7/1992", "11", "7", "1992"] //Why is it matching 11?
是否有任何特定于JavaScript正则表达式的内容需要注意?

尝试使用

^(\d{1,2})\/(\d{1,2})\/(\d{2,4})$
^
在字符串开头断言位置,
$
在字符串末尾断言位置(或在字符串末尾的换行符之前,如果有)。

尝试使用

^(\d{1,2})\/(\d{1,2})\/(\d{2,4})$
^
在字符串开头断言位置,
$
在字符串末尾断言位置(或在字符串末尾的换行符之前,如果有)。

尝试使用

^(\d{1,2})\/(\d{1,2})\/(\d{2,4})$
^
在字符串开头断言位置,
$
在字符串末尾断言位置(或在字符串末尾的换行符之前,如果有)。

尝试使用

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

^
在字符串开头断言位置,
$
在字符串末尾断言位置(或在字符串末尾的换行符之前,如果有)。

首先,这不是处理日期的正确方法。它可以将
99/99/9999
解析为日期。我想你已经意识到了这一点

现在来问你的问题,为什么它被解析为1992年11月7日?因为您没有提供任何边界,它匹配字符串的一部分。你可以用几种方法来做

这将强制整个字符串从头到尾以锚点(
^
$
)开始匹配

使用
\b
来限定数字。这将帮助您从任何字符串的中间进行解析

/\b(\d{1,2})\/(\d{1,2})\/(\d{2,4})\b/

首先,这不是处理日期的正确方法。它可以将
99/99/9999
解析为日期。我想你已经意识到了这一点

现在来问你的问题,为什么它被解析为1992年11月7日?因为您没有提供任何边界,它匹配字符串的一部分。你可以用几种方法来做

这将强制整个字符串从头到尾以锚点(
^
$
)开始匹配

使用
\b
来限定数字。这将帮助您从任何字符串的中间进行解析

/\b(\d{1,2})\/(\d{1,2})\/(\d{2,4})\b/

首先,这不是处理日期的正确方法。它可以将
99/99/9999
解析为日期。我想你已经意识到了这一点

现在来问你的问题,为什么它被解析为1992年11月7日?因为您没有提供任何边界,它匹配字符串的一部分。你可以用几种方法来做

这将强制整个字符串从头到尾以锚点(
^
$
)开始匹配

使用
\b
来限定数字。这将帮助您从任何字符串的中间进行解析

/\b(\d{1,2})\/(\d{1,2})\/(\d{2,4})\b/

首先,这不是处理日期的正确方法。它可以将
99/99/9999
解析为日期。我想你已经意识到了这一点

现在来问你的问题,为什么它被解析为1992年11月7日?因为您没有提供任何边界,它匹配字符串的一部分。你可以用几种方法来做

这将强制整个字符串从头到尾以锚点(
^
$
)开始匹配

使用
\b
来限定数字。这将帮助您从任何字符串的中间进行解析

/\b(\d{1,2})\/(\d{1,2})\/(\d{2,4})\b/

您的正则表达式运行正常。具体情况如下:

19111/7/1992
   ^
   matching starts at this point, everything before that is ignored
您需要指定正则表达式应该从字符串的开头开始,并在字符串的结尾结束:

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

。。。请注意
^
$
,这将导致正则表达式开头或结尾的任何额外字符失败。

您的正则表达式运行正常。具体情况如下:

19111/7/1992
   ^
   matching starts at this point, everything before that is ignored
您需要指定正则表达式应该从字符串的开头开始,并在字符串的结尾结束:

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

。。。请注意
^
$
,这将导致正则表达式开头或结尾的任何额外字符失败。

您的正则表达式运行正常。具体情况如下:

19111/7/1992
   ^
   matching starts at this point, everything before that is ignored
您需要指定正则表达式应该从字符串的开头开始,并在字符串的结尾结束:

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

。。。请注意
^
$
,这将导致正则表达式开头或结尾的任何额外字符失败。

您的正则表达式运行正常。具体情况如下:

19111/7/1992
   ^
   matching starts at this point, everything before that is ignored
您需要指定正则表达式应该从字符串的开头开始,并在字符串的结尾结束:

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

。。。注意
^
$
,这将导致开头或结尾的任何额外字符使正则表达式失败。

实际的匹配例程应该由其他答案很好地解释

要进一步验证日期,您可以执行以下操作:

function valiDate(d) {
    var v, m = d.match(/^(\d{1,2})\/(\d{1,2})\/(\d{1,4})$/);
    if (!m)
        return false;
    v = new Date(m[3], m[2] - 1, m[1]);
    return m[1] == v.getDate() &&
        m[2] == v.getMonth() + 1 &&
        m[3] == v.getFullYear()
    ;
}
或者可能更快:

function valiDate(d) {
    function leap(y) {
        return !((y%4)||(!(y%100) && (y%400)));   
    }
    var m = d.match(/^(\d{1,2})\/(\d{1,2})\/(\d{1,4})$/);

    //  Not match || date or month below 1, or month above 12
    if (!m || m[1] < 1 || m[2] < 1 || m[2] > 12) {
        return false;
    // Jan,Mar,May,Jul,Aug,Oct,Dec
    } else if ([2,4,6,9,11].indexOf(+m[2]) < 0) {
        return m[1] < 32;
    // Feb
    } else if (m[2] === '2') {
        return m[1] < 29 ? true :
            m[1] < 30 && leap(+m[3]);
    // Apr,Jun,Sep,Nov
    } else {
        return m[1] < 31;
    }
}
功能验证(d){
函数跳跃(y){
返回!((y%4)|(!(y%100)&&(y%400));
}
var m=d.match(/^(\d{1,2})\/(\d{1,2})\/(\d{1,4})$/);
//不匹配| |日期或月份低于1,或月份高于12
如果(!m | m[1]<1 | m[2]<1 | m[2]>12){
返回false;
//一月、三月、五月、七月、八月、十月、十二月
}else如果([2,4,6,9,11]),indexOf(+m[2])<0{
返回m[1]<32;
//二月
}else如果(m[2]=“2”){
返回m[1]<29?真:
m[1]<30&&leap(+m[3]);
//四月、六月、九月、十一月
}否则{
返回m[1]<31;
}
}

实际的匹配程序应该由其他答案很好地解释

要进一步验证日期,您可以执行以下操作:

function valiDate(d) {
    var v, m = d.match(/^(\d{1,2})\/(\d{1,2})\/(\d{1,4})$/);
    if (!m)
        return false;
    v = new Date(m[3], m[2] - 1, m[1]);
    return m[1] == v.getDate() &&
        m[2] == v.getMonth() + 1 &&
        m[3] == v.getFullYear()
    ;
}
或者可能更快:

function valiDate(d) {
    function leap(y) {
        return !((y%4)||(!(y%100) && (y%400)));   
    }
    var m = d.match(/^(\d{1,2})\/(\d{1,2})\/(\d{1,4})$/);

    //  Not match || date or month below 1, or month above 12
    if (!m || m[1] < 1 || m[2] < 1 || m[2] > 12) {
        return false;
    // Jan,Mar,May,Jul,Aug,Oct,Dec
    } else if ([2,4,6,9,11].indexOf(+m[2]) < 0) {
        return m[1] < 32;
    // Feb
    } else if (m[2] === '2') {
        return m[1] < 29 ? true :
            m[1] < 30 && leap(+m[3]);
    // Apr,Jun,Sep,Nov
    } else {
        return m[1] < 31;
    }
}
功能验证(d){
函数跳跃(y){
返回!((y%4)|(!(y%100)&&(y%400));
}
var m=d.match(/^(\d{1,2})\/(\d{1,2})\/(\d{1,4})$/);
//不匹配| |日期或月份低于1,或月份高于12
如果(!m | m[1]<1 | m[2]<1 | m[2]>12){