Найти и заменить текст онлайн: регулярки, целые слова и регистр
Как сделать массовую замену прямо в браузере: группы захвата, ловушка с границей слова на кириллице и сохранение регистра.
Весной я переименовывал продукт примерно в 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 в вашем браузере. Ни загрузки на сервер, ни очереди, ни строчки в логах с вашим текстом. Откройте страницу, выключите вайфай, продолжайте работать.
Это стоит того, если вспомнить, что люди на самом деле вставляют в такие поля. Выгрузки из базы. Договоры с фамилиями. Логи, где внутренние имена серверов на каждой второй строке.
Откройте Найти и заменить текст, вставьте свой текст и посмотрите на счётчик совпадений, прежде чем доверять результату.