Javascript正则表达式在IE 6-9中不起作用:;“预期功能”;错误

Javascript正则表达式在IE 6-9中不起作用:;“预期功能”;错误,javascript,regex,internet-explorer,Javascript,Regex,Internet Explorer,我有以下代码: function parseDate(s) { var date = new Date(s); if (!isValidDate(date)) { //iso 860 date parser, as some browsers do not support this via new Date yet var re=/(\d\d\d\d)\D?(\d\d)\D?(\d\d)\D?(\d\d)\D?(\d\d\D?(\d\d\.?(\d*))?)(Z|[+-]\d\d

我有以下代码:

function parseDate(s) {
var date = new Date(s);
if (!isValidDate(date)) {
    //iso 860 date parser, as some browsers do not support this via new Date yet
    var re=/(\d\d\d\d)\D?(\d\d)\D?(\d\d)\D?(\d\d)\D?(\d\d\D?(\d\d\.?(\d*))?)(Z|[+-]\d\d?(:\d\d)?)?/;
    var a=re(s).slice(1).map(function(x,i){
        if (i==6 && x) x=parseInt(x,10)/Math.pow(10,x.length)*1000; // convert to milliseconds
        return parseInt(x,10)||0;
    });
    date = new Date(Date.UTC(a[0],a[1]-1,a[2],a[3]-(a[7]||0),a[4],a[5],a[6]));
}
return date;
};

function isValidDate(d) {
  if ( Object.prototype.toString.call(d) !== "[object Date]" )
       return false;
  return !isNaN(d.getTime());
}
这适用于除IE6-9之外的所有浏览器。我得到了一个错误:

SCRIPT5002:需要函数

它指向这条线:

        var a=re(s).slice(1).map(function(x,i){
有人知道这有什么问题以及如何解决吗

谢谢, 卫斯理

编辑:

如果我将代码更改为:

function parseDate(s) {
var date = new Date(s);
if (!isValidDate(date)) {
    //iso 860 date parser, as some browsers do not support this via new Date yet
    var re=/(\d\d\d\d)\D?(\d\d)\D?(\d\d)\D?(\d\d)\D?(\d\d\D?(\d\d\.?(\d*))?)(Z|[+-]\d\d?(:\d\d)?)?/;
    var a = re.exec(s);
    if (a) { 
        a = a.slice(1);
        a.map(function(x,i){
            if (i==6 && x) x=parseInt(x,10)/Math.pow(10,x.length)*1000; // convert to milliseconds
            return parseInt(x,10)||0;
        });
        document.getElementById('test1').innerHTML = (a[0] + ' ' + a[1] + ' ' + a[2] + ' ' + a[3] + ' ' + a[4] + ' ' + a[5] + ' ' + a[6] + ' ' + a[7]);
        date = new Date(Date.UTC(a[0],a[1]-1,a[2],a[3]-(a[7]||0),a[4],a[5],a[6]));
    }
 }
 return date;
};
它仍然不起作用(抱怨IE中的.map),但有趣的是,它在safari(也许还有其他浏览器)中也不起作用。有什么原因吗

您将注意到,新函数的输出(document.write)是:

2008 11 01 20 39:57.78 57.78-06:00

从旧函数:

2008 11 20 39 57 780-6

根据,你应该使用
re.exec(s)
,而不是
re(s)
。页面还提到
re.test(s)
,但这只是返回真或假,
re.exec(s)
实际上返回匹配项,这似乎是你想要的。

关于
.map
.map()
数组方法是ECMAScript 5提供的新添加内容之一;ECMAScript 5是JavaScript的最新官方版本(2009年12月为5.0,2011年6月为5.1)。目前很少(如果有的话)浏览器完全支持版本5(当然不是IE6)。您可以打赌,要依靠浏览器支持所有新功能(例如
Array.map()
)还需要一段时间

关于regex的日期 不幸的是,JavaScript不允许使用自由间距模式指定正则表达式。这使得像这样的长正则表达式很难阅读。为了解释算法不起作用的原因,我在正则表达式中添加了注释,这些注释指示捕获组真正捕获的内容。以下是PHP语法:

$re_iso8601_date_needs_work='%#原始日期正则表达式
(\d\d\d\d)\d?#$1:年。
(\d\d)\d?#2美元:月。
(\d\d)\d?#$3:天。
(\d\d)\d?#$4:小时。
(#5美元:分和秒???
\d\d\d?#分钟。
(#6美元:可选秒。
\d\d\?#秒(整个部分)。
(\d*)#$7:秒(分数部分)。
)?#第二个选项是可选的。
)#结束5美元:分每秒。
(#$8:可选时区选项。
Z#UTC/祖鲁。
|[+-]\d\d?#或与UTC时数的偏移量和
(:\d\d)?#$9:可选分钟数。
)?#时区是可选的。%x';
提示:分数秒在
$7
中,而不是
$6
中。为什么在
$5
组中同时捕获分和秒


希望这有帮助!:)

谢谢,我改了。请看我上面的编辑,这似乎没有帮助,现在它在safari(也许还有其他浏览器)中也不起作用。@Quickfire55-我总是对答案进行投票,这不是你的意思吗?编辑:谢谢,我现在接受了前面问题的答案。。。我忘了!我们将从现在开始这样做。