我有一个输入字符串,例如CF10, CF6_S01, CF11_S01
。我想按CF6, CF10, CF11
之类的升序排序。不用担心字符串中的_S01
。我正在尝试根据字母后面的第一个数字进行拆分,但是没有用。
var reA = /[^a-zA-Z]/g;
var reN = /[^0-9]/g;
return function(a, b) {
var aA = a[key].replace(reA, "");
var bA = b[key].replace(reA, "");
if (aA === bA) {
var aN = parseInt(a[key].replace(reN, ""), 10);
var bN = parseInt(b[key].replace(reN, ""), 10);
return aN === bN ? 0 : aN > bN ? 1 : -1;
} else {
return aA > bA ? 1 : -1;
}
};
有人可以帮助我如何产生输出:CF6, CF10, CF11
,使用javascript中的正则表达式吗?
答案 0 :(得分:1)
您可以尝试以下简单的单线解决方案:
var arr = ['CF10', 'CF6_S01', 'CF11_S01']
console.log(arr.sort((a,b) => (a.match(/\d+/)[0] - b.match(/\d+/)[0])))
// if you don't want _S01 part
console.log(arr.sort((a,b) => (a.match(/\d+/)[0] - b.match(/\d+/)[0])).map(e => e.split('_')[0]))
答案 1 :(得分:1)
一个特定于您的用例的简单版本,无需使用正则表达式:
'CF10, CF6_S01, CF11_S01'
.split(',')
.map(x => x.trim())
.sort((a, b) => {
const [aa] = a.split('_')
const [bb] = b.split('_')
return aa.slice(2) - bb.slice(2)
})
答案 2 :(得分:0)
您可以将第一部分分为非数字字符和数字。然后按第一部分和第二部分进行排序。
function getParts(s) {
return s.match(/^(\D+)(\d+)/).slice(1);
}
var array = ['CF10', 'CF6_S01', 'CF11_S01'];
array.sort((a, b) => {
var aa = getParts(a),
bb = getParts(b);
return aa[0].localeCompare(bb[0]) || aa[1] - bb[1];
});
console.log(array);
要仅按第一个数字添加字符,可以省略其他字符。
function getValue(s) {
return s.match(/\d+/); // returns an array with only one element
}
var array = ['CF10', 'CF6_S01', 'CF11_S01'];
array.sort((a, b) => getValue(a) - getValue(b));
console.log(array);
答案 3 :(得分:0)
这不是使用regex
let arr = ['CF10', 'CF6_S01', 'CF11_S01'];
arr.sort((a,b) => {
let var1 = a.split('_')[0].split('CF')[1];
let var2 = b.split('_')[0].split('CF')[1];
return var1 - var2
})
console.log(arr)
您可以简单地使用split
函数提取数字部分并基于它进行排序