JS拆分包含数字的字符串将返回带有空元素的数组

时间:2019-03-14 18:36:28

标签: javascript arrays split

给出一个字符串,例如foo123并将其拆分,以便使用split(/(\d+)/g)分隔整数和字符,将返回一个末尾带有空元素的数组

let str  = 'foo123'
let splits = str.split(/(\d+)/g)
console.log(splits)

输出:

[ 'foo', '123', '']

当我期望[ 'foo', '123']时,为什么会发生这种情况,又如何从末尾没有空元素的整数中拆分字符?同样,当输入字符串为foo123bar时,split方法也不会返回空元素。

4 个答案:

答案 0 :(得分:3)

  

为什么会发生

您将数字序列用作定界符。定界符将左侧与右侧分隔开。在您的示例中,分隔符位于字符串的结尾 ,因此右侧为空(->空字符串)。

  

当输入字符串为foo123bar时,为什么split方法不返回空元素?

因为该字符串没有用分隔符结束

这与使用任何其他值作为分隔符没有什么不同

console.log('foo,'.split(','));
console.log('foo,bar'.split(','));

使用正则表达式的特殊之处在于,如果分隔符本身是捕获组的一部分,则分隔符本身也将包含在输出中。


如果输入始终具有相同的结构,即字母后跟数字,那么我只需找到第一个数字的索引,然后相应地对字符串进行切片:

function split(str) {
  const match  = str.match(/\d/);
  if (match) {
    return [str.slice(0, match.index), str.slice(match.index)];
  }
  return [str];
}

console.log(split('foo123'));

答案 1 :(得分:1)

尝试一下:

let str  = 'foo123'
let splits = str.split(/(\d+)/g).filter(x => x!="")
console.log(splits)

这种情况正在发生,因为split方法将您的数组(在这种情况下为字符串)左右分开...以避免这种过滤器删除空格。

答案 2 :(得分:1)

尝试一下

let str  = 'foo123'
let splits = str.split(/(\d+)/g).filter(Boolean)
console.log(splits)

它添加了一个空元素,因为您使用的是数字序列作为分隔符。因此,在您的情况下,右侧将为空,因为数字后没有字符。

答案 3 :(得分:0)

这是因为对于切片定义: .... 如果原始文本以分隔符开头或结尾,则该函数返回一个数组,其第一个或最后一个元素将分别为空文本。 ...