【问题标题】:JS spliting a string that contains numbers returns array with empty elementJS拆分包含数字的字符串返回具有空元素的数组
【发布时间】:2019-03-15 03:03:30
【问题描述】:

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

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

输出:

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

虽然我期待[ 'foo', '123'],但为什么会发生这种情况以及如何将字符从整数中拆分出来,最后没有空元素?此外,当输入字符串为例如 foo123bar 时,拆分方法不会返回空元素。

【问题讨论】:

    标签: javascript arrays split


    【解决方案1】:

    为什么会这样

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

    当输入字符串为 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。旁注:- 为什么不切片 str.match(/[A-Z]+|\d+/gi)
    • 这只是另一种方式¯\_(ツ)_/¯。任何正则表达式实际上都取决于可能输入的范围。我们只知道一个,所以我试图做尽可能少的假设(但当然,期望输入总是非数字后跟数字是一个很大的假设)。
    • 一个问题为什么'foo123'.split(/\d+/)'foo123'.split(/(\d+/)) 给出不同的结果?
    • @CodeManiac 我在回答中提到了这一点:如果分隔符包含捕获组,则捕获组的内容将包含在输出中。因此,如果没有捕获组,则不包括分隔符的任何部分。
    【解决方案2】:

    试试这个:

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

    发生这种情况是因为split 方法将您的数组(在本例中为字符串)拆分为左右...以避免这种仅使用过滤器删除空格。

    【讨论】:

      【解决方案3】:

      试试这个

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

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

      【讨论】:

      • 这与丹尼尔的回答有何不同?
      • 差别不大,但是在filter里面,可以简单的写成Boolean instated。
      【解决方案4】:

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

      【讨论】:

        猜你喜欢
        • 2012-10-01
        • 1970-01-01
        • 2019-06-13
        • 2013-09-01
        • 1970-01-01
        • 2018-08-15
        • 2021-04-05
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多