给出一个字符串,例如foo123
并将其拆分,以便使用split(/(\d+)/g)
分隔整数和字符,将返回一个末尾带有空元素的数组
let str = 'foo123'
let splits = str.split(/(\d+)/g)
console.log(splits)
输出:
[ 'foo', '123', '']
当我期望[ 'foo', '123']
时,为什么会发生这种情况,又如何从末尾没有空元素的整数中拆分字符?同样,当输入字符串为foo123bar
时,split方法也不会返回空元素。
答案 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)
这是因为对于切片定义: .... 如果原始文本以分隔符开头或结尾,则该函数返回一个数组,其第一个或最后一个元素将分别为空文本。 ...