Да — достаточно написать функцию сравнения (или ключ сортировки), которая в начале строки пытается извлечь число и затем сравнивает либо по числовому значению, либо по строке.
Идея:
- удалить начальные пробелы,
- попытаться найти ведущую целую часть (регулярным выражением, ^[+-]?\d+),
- если число найдено — использовать (флаг, числовое значение, хвост строки) как ключ,
- если нет — использовать (флаг, строка) как ключ.
Флаг нужен, чтобы управлять тем, как попадут числа относительно строк без чисел (в примере ниже числа идут раньше).
Примеры.
Python (рекомендованный, простой):
```python
import re
re_num = re.compile(r'^[+-]?\d+')
def sort_key(s):
s_strip = s.lstrip()
m = re_num.match(s_strip)
if m:
num = int(m.group(0))
rest = s_strip[m.end():].lower()
return (0, num, rest) # 0 = строка начинается с числа
else:
return (1, s_strip.lower())
lines = [" 1 строка", "2 строка", "11 строка", "А строка", "10a"]
sorted_lines = sorted(lines, key=sort_key)
print(sorted_lines)
# Результат: [' 1 строка', '2 строка', '11 строка', '10a', 'А строка']
```
(В этом варианте все строки, начинающиеся с числа, идут первыми и среди них порядок по числу; затем все остальные — по алфавиту.)
JavaScript:
```javascript
function parseLeadingNumber(s) {
const t = s.replace(/^\s+/, '');
const m = t.match(/^([+-]?\d+)/);
if (m) return { num: parseInt(m[1], 10), rest: t.slice(m[1].length).toLowerCase() };
return { num: null, rest: t.toLowerCase() };
}
function cmp(a, b) {
const A = parseLeadingNumber(a);
const B = parseLeadingNumber(b);
if (A.num !== null && B.num !== null) {
if (A.num !== B.num) return A.num - B.num;
return A.rest.localeCompare(B.rest);
}
if (A.num !== null) return -1; // числовые строки раньше
if (B.num !== null) return 1;
return A.rest.localeCompare(B.rest);
}
const arr = [" 1 строка", "2 строка", "11 строка", "А строка"];
arr.sort(cmp);
console.log(arr);
```
Linux (sort -V, версия/натуральная сортировка):
- Если строки простые (без сложных локалей), можно использовать `sort -V` (version sort), он сортирует числа по значению, а не по цифрам:
printf " 1 строка\n2 строка\n11 строка\n" | sort -V
Вопросы для уточнения:
- Нужно ли, чтобы строки, начинающиеся с числа, шли перед строками без числа? (в примере я показываю вариант, где числа идут раньше)
- Как обрабатывать отрицательные числа, ведущие нули или десятичные дроби?
- На каком языке/платформе вам нужно решение?
Скажите, какой вариант предпочитаете — покажу точную реализацию под ваш случай.