Как игнорировать в регулярном выражении двойные числа?

Рейтинг: 1Ответов: 3Опубликовано: 15.02.2025

Есть текст формата:

Задачи: 1. Задача, сделать что-то до  28.08. 2. Разобраться с замыканиями.

Есть код:

function disassembleText(text) {
    const disassemble = text.replace(/(\d)/g, '\n$1');
    const crop = disassemble.trim();
    return crop;
};

На выходе получаю текст в формате "

  1. Задача, сделать что-то до 2

0 8.

  1. Разобраться с замыканиями.. "

Желаемый результат:

  1. Задача, сделать что-то до 28.08.
  2. Разобраться с замыканиями.

Подскажите как возможно игнорировать двойные числа в регулярном выражении?

Ответы

▲ 1Принят

А не надо на двузначные числа ориентироваться. Можно ориентироваться на <цифра> + <точка> + <пробел>.

const disassemble = text.replace(/(\d\.\x20\D)/g, '\n$1');
▲ 1

function disassembleText(text) {
  return text.match(/(?:(?<=^|\s)\d+\.\s)?(?:(?!\d+\.\s(?!\d+\.\s)).)+/g)?.join("\n") || text
}

console.log(disassembleText("Задачи: 1. Задача, сделать что-то до 28.08. 2. Разобраться с замыканиями."))
console.log(disassembleText("1. Разработать план мероприятий и ничего не делать. 2. Повторно напиться 'Охоты'. 3. Выполнить какую нить задачу."))
console.log(disassembleText("1. Разработать план мероприятий и ничего не делать."))
console.log(disassembleText("Разработать план мероприятий и ничего не делать."))
console.log(disassembleText("Разработать 2 плана мероприятий 123. и ничего не делать."))
console.log(disassembleText(""))
.as-console-wrapper.as-console-wrapper { max-height: 100vh }

▲ 0

Чтобы найти строки, состоящие из только одной цифры, нужно использовать одно из следующих выражений:

\b\d\b
(?<!\d)\d(?!\d)
(?<!\d)(?<!\d[.,])\d(?![.,]?\d)

\b\d\b находит одну цифру, по обеим сторонам которой нет "словных" символов (цифр или букв из набора ASCII или символа нижнего подчёркивания), (?<!\d)\d(?!\d) находит одну цифру, по обеим сторонам которой нет другой цифры, а (?<!\d)(?<!\d[.,])\d(?![.,]?\d) находит одну цифру, исключая совпадения внутри дробных чисел. Какой из этих шаблонов подойдёт именно вам зависит от входных данных и дальнейшего уточнения проблемы.

Пример кода:

function disassembleText(text) {
    return text.replace(/\b\d\b/g, '\n$&').trim();
};

const text = "Задачи: 1. Задача, сделать что-то до  28.08. 2. Разобраться с замыканиями.";
console.log(disassembleText(text))

Заметьте, что скобки вокруг целого регулярного выражения не нужны, так как в шаблоне замены ссылка на целое совпадение (а не его часть) задаётся с помощью $&.

См. пример работы регулярного выражения.

Ещё, если вы не хотите найти совпадение в начале текста, добавьте блок предварительного просмотра (?!^): \b(?!^)\d\b (пример).