如何在不同长度的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()
会使代码更复杂。
我正在构建一个程序来解码一组字符串,我希望它按以下顺序拆分:
“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()
会使代码更复杂。