为什么在JavaScript中使用这种方法无法分配字符?

4

好的,下面是一个新手问题:

//function removes characters and spaces that are not numeric.

// time = "2010/09/20 16:37:32.37"
function unformatTime(time) 
{       

    var temp = "xxxxxxxxxxxxxxxx";

    temp[0] = time[0];
    temp[1] = time[1];
    temp[2] = time[2];
    temp[3] = time[3];
    temp[4] = time[5];
    temp[5] = time[6];
    temp[6] = time[8];
    temp[7] = time[9];
    temp[8] = time[11];
    temp[9] = time[12];
    temp[10] = time[14];
    temp[11] = time[15];
    temp[12] = time[17];
    temp[13] = time[18];
    temp[14] = time[20];
    temp[15] = time[21];   


}

在 FireBug 中,我可以看到时间中的字符没有分配给 temp 变量?我需要在 JS 中使用 replace() 函数来实现这样的操作吗?
谢谢。

6
这让我哭了。 - Stefan Kendall
2
@Stefan Kendall:别这样嘛,我正在学习嘛... - T.T.T.
2
@Tommy,我不认为他是在“刻薄”,只是在指出这是一种糟糕的方法。虽然可能有点严厉,但即使你的代码让人流泪,你提出了一个比许多人更好的问题(通过记录你已经尝试过的内容)。对于这个问题和评论,我给予+1的支持。 - David Thomas
@David Thomas:我理解了,感谢你要求他澄清答案并帮助“弱者”。哈哈 - T.T.T.
1
@Tommy:啊,不客气;这只是出于我的自私之心... =b - David Thomas
我说话有点严厉了。当我看到另一个学生试图手动创建100个按钮对象以避免使用数组时,我哭泣的方式与此相同。然而,你认识到这种方法是错误的是好事。在十次中有九次,这比一个相对好的方法更有用。 - Stefan Kendall
2个回答

4

[^\d]是指匹配非数字的正则表达式。

更详细地说,

[]表示一个“字符类”,或者一组需要匹配的字符。
\d0-9或任何数字的快捷方式。
字符类中的^表示否定该类。

function unformat(t)
{
   return t.replace( /[^\d]/g, '' );
}

无论如何,在主流浏览器中都不能像那样访问字符串。您需要使用str.charAt(x)


1
@Stefan,只是因为我仍然认为正则表达式是一种黑魔法,你能否向我解释一下/[^\d]/, ''的含义?O_o 我猜测原帖作者,考虑到他最初让你哭泣的方法,可能也会欣赏这个...+1 - David Thomas
1
@Stefan 注意,纯粹的“\D”(没有括号)也表示“不是数字”。 - Pointy
1
哦,如果想要传入任意次数并返回一个未格式化时间的数组,只需使用arguments数组而不是写入参数即可 ==> http://jsfiddle.net/3UW8e/ - Peter Ajtai

3
你在这种情况下一定要使用正则表达式。
function unformatTime(time) {
    return time.replace(/[^\d]/g, '');
}

在这种情况下,它查找任何非数字字符并用空字符串替换。末尾的“g”表示“全局”,因此它将尽可能多地进行替换。

  • ^ 方括号内的这个符号表示“非”
  • \d 这表示“数字”
  • g 这表示“全局”

1
可能是一个愚蠢的问题,但如果 ^ 表示 '不是',\d 表示 '不是数字'...那这不是双重否定吗? - David Thomas
@Pointy:我相信是“^”使\d成为否定的。(看到其他人也有类似的问题)请查看http://www.w3schools.com/jsref/jsref_obj_regexp.asp。 - T.T.T.
1
是的,那样做可以,但是Javascript正则表达式语法已经有一个内置的“非数字”特殊字符,它是“\D”(反斜杠后跟大写字母'D')。 - Pointy
1
@David Thomas 不,"\d" 意味着 "数字",而 "\D" 意味着 "非数字" - 小写与大写之分。你可以单独使用 "\D",不需要方括号(就像可以使用 "\d" 而不需要方括号来匹配数字一样)。 - Pointy
1
@Pointy,啊哈我完全忽略了大小写。...而且我刚刚才了这些眼镜=)(还有,这也可能是我仍然觉得正则表达式难以理解的原因...) - David Thomas

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接