【问题标题】:Javascript split() Regex expression returns unwanted comma in ChromeJavascript split() 正则表达式在 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,我猜是最新的。

标签: javascript regex google-chrome comma


【解决方案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 个元素(即至少是原始字符串)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-02-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多