【问题标题】:explode string with different operator用不同的运算符分解字符串
【发布时间】:2020-12-17 12:50:56
【问题描述】:

这可以用不同的操作符分解字符串吗?

我需要将每个代码(不同大小的)编号为[]

这是输入中所有不同可能性的示例:

const codes = [
   '[5018902847][592][50189272809][5089113805]',
   '[3898]',
   '[375001833][3475001021]',
    '',
]

我需要什么:

[5018902847, 592, 50189272809, 5089113805]
[3898]
[375001833, 3475001021]
null // because code is empty

我的第一个解决方案是这样的:

codes.map(code => {
    const res = code.split('[ '| '][' | ']');
    console.log(res)
})

但结果的一个例子是:

[
  ' [5',
  '51889',
  '28475][5',
  '51889424192][5',
  '518892728',
  '9][5',
  '518891138',
  '5]'
]

【问题讨论】:

  • "但是结果的一个例子是......" - console.log('[ '| '][' | ']') 会告诉你原因
  • 其实我不明白为什么只有[5这样的东西
  • 按照我在第一条评论中的建议去做。输出是什么,因此您对.split() 的论点是什么?
  • codes.map(code => code.match(/\d+/g))
  • @Andreas 好的,谢谢,代码返回 0,我不知道

标签: javascript arrays string algorithm


【解决方案1】:

您也可以不使用match(来自@hgb123 答案)。

const codes = [
  "[5018902847][592][50189272809][5089113805]",
  "[3898]",
  "[375001833][3475001021]",
  "",
]

const res = codes.map((code) => {
  var extracted = code.split(']').filter(Boolean).map(x => {return x.replace("[","");})
  return extracted && extracted.map(Number)
})

console.log(res)

【讨论】:

    【解决方案2】:

    你可以使用String.prototype.match()

    const codes = [
      "[5018902847][592][50189272809][5089113805]",
      "[3898]",
      "[375001833][3475001021]",
      "",
    ]
    
    const res = codes.map((code) => {
      const extracted = code.match(/\d+/g)
      return extracted && extracted.map(Number)
    })
    
    console.log(res)

    【讨论】:

      【解决方案3】:

      您可以定义一个正则表达式分隔符:

      > '[5018902847][592][50189272809][5089113805]'.split(/[\[\]]/)
      [
        '',
        '5018902847',
        '',
        '592',
        '',
        '50189272809',
        '',
        '5089113805',
        ''
      ]
      

      要将您的 codes 数组转换为所需的格式,这里有一个很酷的单行:

      const codes = [
         '[5018902847][592][50189272809][5089113805]',
         '[3898]',
         '[375001833][3475001021]',
          '',
      ]
      const cleanedCodes = codes.map(code => code.split(/[\[\]]/).filter(s => s.length)).filter(a => a.length)
      console.log(cleanedCodes);
      /*
       * will output : [
       *  [ '5018902847', '592', '50189272809', '5089113805' ],
       *  [ '3898' ],
       *  [ '375001833', '3475001021' ]
       * ]
       *
       */
      
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-06-15
        • 2019-06-11
        • 2012-08-11
        • 2020-02-02
        • 2020-07-04
        • 2018-03-31
        • 2016-03-25
        • 2018-07-09
        相关资源
        最近更新 更多