Текст и повседневные инструменты · Текстовый инструментарий
Почему инструмент поиска и замены должен выдерживать полутипизированное регулярное выражение
· Почему это важно
найти и заменить регулярные выражения редактирование текста
Ввод шаблона происходит постепенно, поэтому одна открывающаяся скобка является нормальным состоянием; в этом посте утверждается, что защита компиляции, оставление текста нетронутым и предложение отмены — это функции корректности, а не полировки.
Инструмент, который очистил коробку на несбалансированном кронштейне — как одно нажатие клавиши может разрушить час очистки
Поле поиска и замены часто содержит работу, сборка которой заняла гораздо больше времени, чем шаблон поиска рядом с ним. Если неполное выражение может пройти через интерфейс, очистить редактор или оставить его состояние неопределенным, инструмент сделал ввод шаблона более опасным, чем задача очистки, которую он должен был упростить.
В репозитории не документирован конкретный инцидент, в котором ToolAcre стёр час работы, поэтому эту историю нельзя представить как факт. В любом случае оправданное требование является более строгим: пользовательский текст должен оставаться неизменным в случае сбоя компиляции шаблона, независимо от того, сколько текста присутствует или сколько времени потребовалось для его подготовки.
Разрушительный отказ, который должен предотвратить инструмент поиска и замены.
Регулярные выражения обычно не вводятся одним точным нажатием клавиши. Человек вводит открывающую скобку перед закрывающей скобкой или начинает класс символов с открывающей скобки перед добавлением его членов. В эти моменты поле содержит синтаксически неполный шаблон, хотя процесс редактирования протекает нормально.
Если рассматривать это временное состояние как исключительное поведение пользователя, редактор станет хрупким. Полезным ответом является немедленная локальная обратная связь: покажите, что текущий шаблон не может скомпилироваться, сохраните все остальные поля и позвольте следующему нажатию клавиши исправить их. Недопустимая ошибка регулярного выражения должна описывать текущий черновик, а не завершать рабочий процесс.
Неполные шаблоны являются нормальным явлением во время написания регулярного выражения.
ToolAcre направляет каждый запрос пользователя через `compilePattern`. При буквальном поиске сначала экранируются метасимволы регулярных выражений, а в режиме Regex напрямую используется предоставленный источник. Компиляция происходит внутри блока `try`, и ошибка возвращает пустой шаблон плюс строку ошибки вместо того, чтобы позволить исключению JavaScript выйти в интерфейс.
Этот результат управляет путем замены. Когда компиляция сообщает об ошибке, `findReplace` возвращает исходный текст, ноль замен и ошибку. Он не пытается выполнить частичный поиск или перезапись. Таким образом, защита защищает как стабильность интерфейса, так и целостность данных: отсутствие допустимого шаблона означает отсутствие изменений в содержимом редактора.
Отчет о том, что произошло: почему подсчет замен после каждого запуска — самая быстрая проверка работоспособности
Успешная замена все еще может быть логически ошибочной. Широкое выражение может соответствовать большему количеству дат, чем предполагалось, а опция регистра или граница целого слова могут уменьшить набор до нуля. ToolAcre подсчитывает совпадения перед вызовом стандартной замены строки и возвращает это число вместе с переписанным текстом, делая область видимости видимой после каждого запуска.
Подсчет — это быстрая проверка здравомыслия, а не доказательство того, что каждое совпадение было желательным. Если ожидалось двенадцать записей, а результат показывает 1 или 1,200, остановитесь и проверьте шаблон, прежде чем копировать выходные данные. Точное число превращает смутное подозрение в конкретную причину отменить и пересмотреть обыск.
Отмена как подстраховка — каждое преобразование обратимо, с документально подтвержденным ограничением в пятьдесят операций.
Безопасность компиляции предотвращает изменение текста недопустимыми шаблонами, но действительные шаблоны все равно могут выражать неправильное намерение. Отмена охватывает эту вторую категорию. Text Toolkit записывает преобразования, поэтому завершенную замену можно отменить после того, как подсчет результатов или выходные данные покажут, что поиск был слишком широким, слишком узким или неправильно сгруппированным.
Документированный предел истории составляет пятьдесят операций, поэтому отмена — это рабочий буфер, а не постоянный контроль версий. Используйте его для экспериментов небольшими шагами, но не рассматривайте его как архивное хранилище. Для важных материалов сохраните оригинал отдельно и скопируйте готовый результат только после проверки текста и количества замен.
Рабочий пример — построение шаблона переформатирования даты посимвольно и наблюдение за появлением и исчезновением ошибки без потери текста.
Рассмотрите возможность изменения дат с `2024-01-02` на `02/01/2024`. Включите Regex и начните с открывающей скобки. В этот момент движок браузера сообщает о недопустимом выражении, ToolAcre отображает сообщение, а текст остается нетронутым. Добавьте `\d{4}` и закрывающую скобку, и первый зафиксированный год станет действительным.
Продолжайте, пока поиск не достигнет `(\d{4})-(\d{2})-(\d{2})`, затем используйте `$3/$2/$1` в качестве замены. Эти три захвата изменяют порядок года, месяца и дня без повторного ввода каждой строки. Запустите команду «Заменить все», сравните полученное количество с ожидаемыми строками и немедленно отмените операцию, если несвязанный числовой текст также совпал.
Чего это не касается — проблемы с производительностью регулярных выражений, такие как катастрофический возврат при больших входных данных.
Защита компиляции устраняет синтаксические ошибки, а не время выполнения допустимых выражений. Шаблон может успешно скомпилироваться, но при этом сильно откатиться при определенных входных данных. Поскольку замена выполняется в основном потоке, патологическое выражение, примененное к большому документу, все равно может привести к тому, что вкладка браузера не будет отвечать на запросы, даже если не было создано никакого исключения.
Инструмент также выполняет замену всех, а не просматривает совпадения по отдельности, и не выполняет предварительный просмотр выделенных совпадений перед мутацией. Эти ограничения делают важными узкие данные испытаний и количество замен. Проверьте незнакомое выражение на небольшой репрезентативной выборке, прежде чем применять его к единственной копии большого документа.
Вывод: Text Toolkit рассматривает недопустимые шаблоны как информацию, а не как ошибку, поэтому вы можете безопасно экспериментировать.
Неполный шаблон — это информация о состоянии редактирования, а не свидетельство того, что пользователь потерпел неудачу. ToolAcre сохраняет это различие в своих возвращаемых значениях: компиляция может сообщать об ошибке без выдачи выдачи, замена может сообщать о нулевых изменениях, не затрагивая источник, а успешная операция может точно сообщить, сколько совпадений было перезаписано.
Этот дизайн поддерживает эксперименты, не притворяясь, что регулярные выражения безвредны. Сохраняйте входные данные в случае сбоя компиляции, проверяйте счетчики после успеха и используйте отмену, когда допустимый шаблон концептуально ошибочен. В совокупности эти действия делают поиск и замену достаточно предсказуемыми для случайных пользователей регулярных выражений, которым больше нужна обратная связь, чем наказание за полутипизированное выражение.