如何在不同长度的js中拆分字符串?

How to split strings in js with varying length?

我正在构建一个程序来解码一组字符串,我希望它按以下顺序拆分:

“ansdl001, badgef001, abcdeh002, mfghe002”

    [ 'ansdl001', 'badgef001', 'abcdeh002', 'mfghe002' ]

    [
       [ 'a', 'n', 's', 'dl', ‘001’ ],
       [ 'b', 'a', 'd', 'gef', ‘001’ ],
       [ 'a', 'b', 'c', 'deh', ‘002’ ],
       [ 'm', 'f', 'g', 'he', ‘003’ ]
    ]

只有一种方法可以知道第四个子字符串何时结束,即在数字开始之前。但是,我不知道要解决这个问题。我们也知道前三个子串总是一个字母。

我现在有以下代码,它将字符串拆分为一位字符串。

let string = "ansdl001,badgef001,abcdeh002,mfghe002";
let array = string.split(",");

console.log(array);

for( var i = 0; i < array.length; i++ ) {

    array[i] = array[i].split("");

}

array.forEach( (element) => { console.log(element)  } );

/*[
  'a', 'n', 's',
  'd', 'l', '0',
  '0', '1'
]
[
  'b', 'a', 'd',
  'g', 'e', 'f',
  '0', '0', '1'
]
[
  'a', 'b', 'c',
  'd', 'e', 'h',
  '0', '0', '2'
]
[
  'm', 'f', 'g',
  'h', 'e', '0',
  '0', '2'
]
*/

如何根据条件将最后两个子字符串分开?

这是一种方法,但我相信它可以改进

let string = "ansdl001,badgef001,abcdeh002,mfghe002";
let array = string.split(",");

console.log(array);


let newarrays=[]

array.forEach(el => {
 // get numbers first
 let lastitem = el.match(/\d+/g);
 let tmp = el.split(lastitem)[0];
 let lastletters = tmp.substr(3);
 tmp=tmp.split('');
 newarrays.push([tmp[0], tmp[1], tmp[2], lastletters, lastitem])
})
console.log(newarrays)
// Split into array of strings, note the space next to the comma
const myArr =  "ansdl001, badgef001, abcdeh002, mfghe002".split(", ")

// Loop over the array with .map() so it returns an array
const newArr = myArr.map(str => {

  // Index where the numbers start
  const numIdx = str.length-3
  
  // Get the numbers as a string
  const end = str.substr(numIdx)

  // Get the middle
  const middle = str.slice(3, numIdx)

  // Get the start
  const start = str.slice(0, 3).split("")
  
  // Return in new array
  return [...start, middle, end]
})

newArr.forEach(item => display(item))

我建议使用以下代码:

let string = "ansdl001,badgef001,abcdeh002,mfghe002";
let array = string.split(",").map(
        el => el.match(/(\D)(\D)(\D)(\D*)(\d*)/).slice(1)
    );

array.forEach( (element) => { console.log(element)  } );

正则表达式的解释:

  • (\D) 匹配第一个非数字
  • (\D) 匹配第二个非数字
  • (\D) 匹配第三个非数字
  • (\D*) 匹配
  • 之后的任何非数字
  • (\d*)匹配最后的任意数字

由于 String.match(...) returns 一个以整个匹配开始然后列出子表达式匹配的数组,我必须删除带有 slice(1) 的第一个条目。

注意 slice(...) 复制数组,但使用 pop() 会使代码更复杂。