belun.app Блог
EN

Найти и заменить текст онлайн: регулярки, целые слова и регистр

Как сделать массовую замену прямо в браузере: группы захвата, ловушка с границей слова на кириллице и сохранение регистра.

Руки набирают текст на клавиатуре ноутбука, редактирование документа: найти и заменить текст

Весной я переименовывал продукт примерно в 340 строках маркетингового текста. Дело на минуту. Ищем «Маяк», меняем на «Ореол», четыре секунды.

Потом я прочитал результат. «Маяки» стали «Ореолами», это ожидаемо. Но «Маяковского» в адресе клиента превратилось в «Ореоловского». А каждое предложение, которое начиналось с «Маяк», теперь начиналось со строчного «ореол»: я набрал замену с маленькой буквы, и инструмент понял меня буквально.

Вот вся история поиска и замены в одном абзаце. Найти — это просто. Всё интересное живёт в трёх галочках рядом. Поэтому в инструменте Найти и заменить текст они лежат прямо под полем ввода, а не спрятаны за ссылкой «дополнительно».

Целые слова сложнее, чем кажется

Галочка «Целые слова» спасла бы Маяковского. Но с ней связана ловушка, в которую попадает почти каждый онлайн-инструмент, и бьёт она ровно по тем, кто пишет не на английском.

Обычная реализация оборачивает запрос в \b — якорь границы слова. В JavaScript \b определён через \w, а \w — это ровно [A-Za-z0-9_]. И больше ничего. Ни é, ни ß, ни одной кириллической буквы.

Ищете кот с включёнными целыми словами — и такой инструмент спокойно находит его внутри котёнок, потому что для регулярки ё сразу после совпадения вообще не буква. То же самое с café и cafés во французском или с любым немецким словом на ü.

Здесь \b не используется. Символы слева и справа от совпадения проверяются по полным юникодным категориям букв и цифр. Кириллица, греческий, вьетнамский, латиница с диакритикой — границы ставятся так, как их видит человек.

Группы захвата переформатируют текст

Включите «Регулярку», и поле замены начинает понимать $1, $2 и $<имя>. С этого момента замена перестаёт быть просто переименованием.

Несколько шаблонов, которые окупаются:

  • (\w+), (\w+) с заменой на $2 $1 переворачивает целый столбец Иванов, Иван в Иван Иванов
  • (\d{4})-(\d{2})-(\d{2}) с заменой на $3.$2.$1 превращает даты ISO в тот формат, который реально понимает ваша таблица
  • \n{2,} с заменой на пробел схлопывает мешанину пустых строк после копирования из PDF

Якоря работают построчно: ^ — это начало каждой строки, а не начало всего документа. Приписать домен к 200 ссылкам можно заменой ^ на https://example.com.

Если «Регулярка» выключена, строка замены буквальная. Набранный $1 останется $1 — важно, когда правишь текст про цены.

Сохранять регистр

Та самая настройка, которая починила бы мои строчные начала предложений. И та, которой у большинства инструментов просто нет.

«Учитывать регистр» и «Сохранять регистр» звучат похоже, а делают противоположные вещи. Первая решает, что считать совпадением. Вторая решает, что записать обратно: меняем «цвет» на «оттенок», и ЦВЕТ становится ОТТЕНОК, Цвет — Оттенок, цвет — оттенок. Три написания, один проход, потом ничего доправлять не надо.

Текст не покидает вкладку

Замена выполняется на JavaScript в вашем браузере. Ни загрузки на сервер, ни очереди, ни строчки в логах с вашим текстом. Откройте страницу, выключите вайфай, продолжайте работать.

Это стоит того, если вспомнить, что люди на самом деле вставляют в такие поля. Выгрузки из базы. Договоры с фамилиями. Логи, где внутренние имена серверов на каждой второй строке.

Откройте Найти и заменить текст, вставьте свой текст и посмотрите на счётчик совпадений, прежде чем доверять результату.

Попробуйте инструмент

Найти и заменить текст →