在JavaScript中对复杂字符串进行排序

时间:2018-07-11 08:35:37

标签: javascript regex

我有一个输入字符串,例如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中的正则表达式吗?

4 个答案:

答案 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函数提取数字部分并基于它进行排序