Javascript 正则表达式在JS中无法正常工作
我想用这个正则表达式为特定的日期格式(与date.parse-NaN不兼容)提供一个简单的捕获和测试程序: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"
/(\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){