Javascript split() 正则表达式在 Chrome 中返回不需要的逗号

Posted

技术标签:

【中文标题】Javascript split() 正则表达式在 Chrome 中返回不需要的逗号【英文标题】:Javascript split() Regex expression returns unwanted comma in Chrome 【发布时间】:2013-11-11 12:24:08 【问题描述】:

我写了一个简单的正则表达式来确定文本框是否只填充数字。

document.getElementById("id").value.split(/\d/).length;

如果这一行的结果等于 0,则语句为真,但似乎 value.split(/\d/) 在我 alert() 时返回一个逗号,所以长度为 1(alert() 仅返回我将它用于 @ 时写入的内容987654325@)

这在 ie 中完美无缺,但在 chrome 中我得到一个逗号。为什么会发生这种情况,我的正则表达式不正确吗?我也尝试了/^\d+$/,但得到了相同的结果。

【问题讨论】:

你用的是哪个版本的IE? 现在是 10.0.92,我猜是最新的。 【参考方案1】:

使用RegExp.test方法更合适:

/^\d+$/.test(document.getElementById('id').value)

例如:

> /^\d+$/.test('1234')
true
> /^\d+$/.test('12,34')
false
> /^\d+$/.test('abcd')
false

.split(/\d/) 返回 n+1 个项目的数组。 (n = 包含的位数):

> '1234'.split(/\d/)
["", "", "", "", ""]
> '1234'.split(/\d/).length
5
> 'asdf'.split(/\d/)
["asdf"]
> 
'asdf'.split(/\d/).length
1

为什么你得到,,,alert 将参数转换为字符串:

> String('1234'.split(/\d/)) // === String(['', '', '', '', ''])
",,,,"

【讨论】:

确实test 更好,但 OP 可能正试图弄清楚为什么他/她的代码在 Chrome 和 IE 中的行为不同。 做到了!感谢@falsetru,现在代码在两种浏览器中都可以使用。仍然想知道如果输入有 4 个元素,为什么它会返回第 5 项?我刚刚通过 Chrome 调试器检查了它,是的,它返回 n+1 的数组? @SercanAltundaş, IE 10, 9, 8, 7 也为我返回 n+1 个项目数组。想想'A8B'.split(/\d/):它返回['A', 'B']。和'8'.split(/\d/) 返回['', '']。 (第一个空字符串在数字之前,第二个空字符串在数字之后)。【参考方案2】:

一种选择是使用像这样的正则表达式:

var re = /^\d+$/;

或者简单地否定isNaN() 以在号码检查中得到真或假:

// dunno if you have to parseInt() first, haven't tested it
if(!isNaN(document.getElementById("id").value))
    // do stuff

【讨论】:

【参考方案3】:

发生这种情况的原因是,如果你拆分一个空字符串,你仍然会得到一个空字符串。

"".split("abc") // returns [""]

所以数组只有一个元素。这是正确的行为。

当您使用原始字符串中未包含的字符串拆分不同的字符串时,会发生相同的行为:

"dsfsf".split("123") // returns ["dsfsf"]

这在 IE 上“工作”的原因是因为该浏览器中的实现实际上是错误的,因为该函数应该始终返回 n+1 个元素(即至少是原始字符串)。

【讨论】:

以上是关于Javascript split() 正则表达式在 Chrome 中返回不需要的逗号的主要内容,如果未能解决你的问题,请参考以下文章

javascript /jquery 如何split 正则表达式

Javascript正则表达式获取双引号内容

javascript正则

理清JavaScript正则表达式

JavaScript 正则表达式

javascript split函数