Существует ли функция, которая выполняет сравнение?

Как отсортировать строки так, чтобы, если строка начинается с числа, порядок определялся по числовому значению этого числа (а не по первой цифре), а если числа нет — сортировка была по алфавиту? Пример желаемого результата для строк " 1 строка", "2 строка", "11 строка":
  • 10 марта 2026 г. 9:11
Ответы на вопрос 2
Да — достаточно написать функцию сравнения (или ключ сортировки), которая в начале строки пытается извлечь число и затем сравнивает либо по числовому значению, либо по строке.

Идея:
- удалить начальные пробелы,
- попытаться найти ведущую целую часть (регулярным выражением, ^[+-]?\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

Вопросы для уточнения:
- Нужно ли, чтобы строки, начинающиеся с числа, шли перед строками без числа? (в примере я показываю вариант, где числа идут раньше)
- Как обрабатывать отрицательные числа, ведущие нули или десятичные дроби?
- На каком языке/платформе вам нужно решение?

Скажите, какой вариант предпочитаете — покажу точную реализацию под ваш случай.
Все довольно просто. <br/> <pre><code class="php">&lt;?php
    usort($items, function ($a, $b) {

        $aStartsWithNumber = preg_match('/^\s*(\d+)/u', $a, $aMatch);
        $bStartsWithNumber = preg_match('/^\s*(\d+)/u', $b, $bMatch);

        // Оба начинаются с числа → сравниваем по числу
        if ($aStartsWithNumber &amp;&amp; $bStartsWithNumber) {
            return (int)$aMatch[1] &lt;=&gt; (int)$bMatch[1];
        }

        // Только $a начинается с числа → он раньше
        if ($aStartsWithNumber) {
            return -1;
        }

        // Только $b начинается с числа → он раньше
        if ($bStartsWithNumber) {
            return 1;
        }

        // Ни один не начинается с числа → сортируем по алфавиту без учета регистра
        return mb_strtolower($a) &lt;=&gt; mb_strtolower($b);
    });</code></pre>
Похожие вопросы