Я хотел бы отсортировать массив строк (в javascript) так, чтобы группы цифр внутри строк сравнивались как целые числа, а не строки. Меня не беспокоят числа со знаком или с плавающей запятой.
например, результат должен быть [«a1b3», «a9b2», «a10b2», «a10b11»]
не [«a1b3», «a10b11», «a10b2», "a9b2"]
Самый простой способ сделать это - разбить каждую строку по границам вокруг групп цифр. Есть ли шаблон, который я могу передать в String.split, чтобы разделить границы символов без удаления каких-либо символов?
"abc11def22ghi" .split (/? /) = ["Abc", "11", "def", "22 "," ghi "];
Или есть другой способ сравнения строк, который не предполагает их разделения, например, путем дополнения всех групп цифр ведущими нулями, чтобы они имели одинаковую длину?
" aa1bb "= > "aa00000001bb", "aa10bb" => "aa00000010bb"
Я работаю с произвольными строками, а не с строками с определенным расположением групп цифр.
Редактировать:
Мне нравится / (\ d +) /
один лайнер от Габи для разделения массива. Насколько это обратно совместимо?
Решения, которые анализируют строки один раз таким образом, чтобы их можно было использовать для восстановления оригиналов, намного более эффективны, чем эта функция сравнения.Ни один из ответов не обрабатывает некоторые строки, начинающиеся с цифр, а другие - нет, но это было бы достаточно легко исправить, и в исходном вопросе не было явного.
["a100","a20","a3","a3b","a3b100","a3b20","a3b3","!!","~~","9","10","9.5"].sort( function ( inA , inB ) {
var result = 0;
var a , b , pattern = /(\d+)/;
var as = inA.split( pattern );
var bs = inB.split( pattern );
var index , count = as.length;
if ( ( '' === as[0] ) === ( '' === bs[0] ) ) {
if ( count > bs.length ) count = bs.length;
for ( index = 0 ; index < count && 0 === result ; ++index ) {
a = as[index]; b = bs[index];
if ( index & 1 ) {
result = a - b;
} else {
result = !( a < b ) ? ( a > b ) ? 1 : 0 : -1;
}
}
if ( 0 === result ) result = as.length - bs.length;
} else {
result = !( inA < inB ) ? ( inA > inB ) ? 1 : 0 : -1;
}
return result;
} ).toString();
результат: "!!, 9,9.5,10, a3, a3b, a3b3, a3b20, a3b100, a20, a100, ~~"