如果我有一个字符串AYUKB17053UI903TBC
。我想要一个函数来返回ABKUY01357IU039BCT
。因此,字符串的每个字母部分和数字部分都被排序。但他们保留了原来的订单。。。
我们可以假设输入只包含数字和英文字母
我想出了一个解决方案,但我认为它并不优雅。
const string1 = 'AYUKB17053UI903TBC'
const string2 = `ABKUY01357IU039BCT`
function fn1(string1) {
let tempArray = [[]]
for (const char of string1) {
let lastCharIsNumber
let currentCharIsNumber
const lastArray = tempArray[tempArray.length - 1]
if(!lastArray.length){
lastArray.push(char)
continue
}
currentCharIsNumber = !Number.isNaN(Number(char))
lastCharIsNumber = !Number.isNaN(Number(lastArray[lastArray.length - 1]))
if (currentCharIsNumber && lastCharIsNumber) lastArray.push(char)
else if (!currentCharIsNumber && !lastCharIsNumber) lastArray.push(char)
else tempArray.push([char])
}
tempArray.forEach(item => item.sort())
return tempArray.map(array => array.join('')).join('')
}
console.log(fn1(string1) === string2); // true
有人能帮助改进我的解决方案吗?
有一个更短的解决方案:
let str = 'AYUKB17053UI903TBC';
let res = str.match(/[a-zA-Z]+|d+/gi).map((substr) => {
return substr.split('').sort().join('');
}).join('');
说明:
构建正则表达式:
1.1.我们用
[0-9]
或d
表示法来匹配数字。1.2.我们将字母与
[a-zA-Z]
匹配。1.3.我们需要在每一次出现中至少匹配一个数字,或者在每次出现中至少对应一个字母。因此,我们使用加号
+
来表示我们希望在每个匹配中都有一个或多个。1.4.
match
函数将返回一个数组,其中包含正则表达式在给定字符串中匹配的所有匹配项。1.5.我们在最后一个斜杠后面使用一个标志来表示我们不在乎区分大小写,在本例中,正则表达式声明中
/
后面的字母i
。1.6.我们还使用标志
g
来避免在第一场比赛之后停止比赛。使用带有函数
match
的正则表达式,我们将字符串分为多个只有数字或字母的组。也就是说,正则表达式将返回一个字符串数组。- 对于每个组,我们使用
sort
函数将它们按顺序排列,如果您有区分大小写的字符串,则可能需要提供另一种排序方法 - 我们终于把所有东西都放回原处,把它们整理好