Текст и повседневные инструменты · Текстовый инструментарий
Литерал или регулярное выражение? Почему точка в поисковом запросе может изменить любой результат
· Почему это важно
найти и заменить регулярные выражения редактирование текста
Объясняет, какие символы имеют значение в регулярных выражениях, что происходит не так, когда «a.b» или «v1.2 (beta)» рассматривается как шаблон, и почему литеральный режим, экранирующий все, должен использоваться по умолчанию.
Поиск «v1.2» и сопоставление «v102» — как инструмент, работающий с регулярными выражениями, незаметно превращает знаки препинания в подстановочные знаки
Агент службы поддержки, изменяющий `v1.2` в примечаниях к выпуску, может разумно ожидать, что эти четыре символа будут обозначать одну метку версии. Однако если включено регулярное выражение, точка означает любой символ, кроме разрыва строки. Таким образом, шаблон может соответствовать `v102`, `v1-2` или `v1x2`, а команда «Заменить все» может изменить записи, которые никогда не были частью запрошенного выпуска.
Этот сбой тихий, потому что шаблон действителен. Нет сообщения об ошибке, позволяющего отличить преднамеренный подстановочный знак от знака препинания, скопированного из имени файла. Первым предупреждением может быть неожиданно большое количество замен. Когда стоит задача точно заменить известный текст, пунктуация должна быть данными, а не инструкцией поисковой системе.
Метасимволы — точка, скобки, круглые скобки, плюс, звездочка, вопросительный знак, черта, каретка, доллар и обратная косая черта, а также назначение каждого из них.
В режиме регулярного выражения JavaScript точка является подстановочным знаком; квадратные скобки определяют класс символов; круглые скобки создают группу; плюс, звездочка и вопросительный знак контролируют повторение; и труба предлагает альтернативы. Знак каретки и доллара привязывает шаблон к началу или концу всего текста в этом инструменте, поскольку многострочный режим не включен.
Обратная косая черта меняет способ чтения следующего символа, а фигурные скобки могут выражать количество повторений. Эти символы имеют значение только в тех позициях, где грамматика регулярных выражений обрабатывает их особым образом, поэтому запоминание списка менее надежно, чем принятие решения о том, какой режим необходим для задания. Если вы соответствуете предоставленной метке, фрагменту пути или имени файла, начните буквально.
Метасимволы, которые важны в режиме регулярных выражений JavaScript
В буквальном режиме поиск означает то, что было напечатано. ToolAcre экранирует метасимволы регулярного выражения перед компиляцией поиска, поэтому `v1.2 (beta)` соответствует точкам, пробелам и скобкам. Он не превращает фразу в подстановочный знак, за которым следует группа захвата, и по-прежнему находит каждое точное вхождение в тексте.
Этот побег происходит только на стороне поиска. Поле замены по-прежнему соответствует правилам строки замены JavaScript, где `$&` вставляет совпадающий текст, а `$$` выдает один знак доллара. Таким образом, буквальный поиск является безопасным способом идентификации текста по умолчанию, но замена, содержащая знаки доллара, по-прежнему заслуживает тщательной проверки, прежде чем будет выбран параметр «Заменить все».
Режим Regex — когда вам нужна мощь и как самостоятельно экранировать отдельные символы
Режим Regex полезен, когда несколько форм должны соответствовать одному правилу. Шаблон может быть нацелен на диапазон цифр, необязательные знаки препинания или альтернативы без перечисления каждого исходного написания. Включайте Regex только в том случае, если такая изменчивость является намеренной, а затем экранируйте специальный символ обратной косой чертой, если он должен сохранить свое обычное значение, например `.` для точки.
Инструмент компилирует шаблон с синтаксисом регулярного выражения JavaScript и всегда применяет его глобально. Отключение учета регистра добавляет сопоставление без учета регистра, но флаги многострочного, многоточечного, липкого и юникодного значения не предлагаются. Неверный синтаксис сообщается без изменения текста. Действительный, но слишком широкий шаблон по-прежнему работает, поэтому успех компиляции не является доказательством безопасного набора совпадений.
Рабочий пример — замена «config.yml (старый)» в примечаниях к выпуску в буквальном режиме, а затем попытка сделать то же самое в режиме регулярного выражения, чтобы увидеть разницу.
Обратите внимание на примечания к выпуску, содержащие `Load config.yml (old)`, `Archive configXyml old` и `Keep config.yml (new)`. Отключив Regex, найдите `config.yml (old)` и замените его на `config.yml (legacy)`. Изменяется ровно первая фраза, поскольку точка и круглые скобки экранируются перед компиляцией шаблона.
Включите Regex и выполните тот же неэкранированный поиск. Точка может содержать другой символ, а группа скобок `old` вместо соответствующих буквальных круглых скобок, поэтому предполагаемая строка больше не соответствует написанному. Эквиваленту регулярного выражения требуется `config.yml (old)`. Буквальная версия короче, понятнее и лучше соответствует этой точной текстовой задаче.
Распространенные ошибки — пробелы в поле поиска, путаница целого слова и литерала, забывание проверки количества замен.
Конечные пробелы легко не заметить, поскольку поле поиска придает им небольшой визуальный вес, однако литеральный режим их сохраняет. Поиск `beta ` не будет соответствовать `beta` в конце строки. Проверяйте границы поля, когда ясно видимый термин сообщает об отсутствии замен, и избегайте добавления пробелов только для того, чтобы отделить скопированный текст от окружающей прозы.
Целое слово — это не другое название буквального. Он оборачивает скомпилированный поиск в границы слов, которые здесь основаны на ASCII и могут давать сбои в отношении пунктуации или слов с ударением. Также проверяйте количество замен после каждого запуска и используйте команду «Отменить», когда это неожиданно. Подсчет является свидетельством масштаба, а не декоративным сообщением об успехе.
Распространенные ошибки: пробелы, границы целого слова и синтаксис замены.
На этой странице не представлено полное руководство по флагам регулярных выражений. ToolAcre использует глобальное сопоставление и, при необходимости, сопоставление без учета регистра, при этом привязки по-прежнему относятся к полному тексту, а не к каждой строке. Шаблоны, скопированные из движков со встроенными флагами, классами POSIX или другим синтаксисом, могут не скомпилироваться или могут означать что-то другое в браузере.
Группы захвата поддерживаются, поэтому схему необходимо исправить, а не говорить, что они находятся за пределами инструмента. В режиме Regex на группы можно ссылаться с помощью `$1`, `$2` и более поздних номеров при замене. Эта возможность отделена от буквального поиска и от ограниченных элементов управления флагами; используйте его только тогда, когда фактической целью является реструктуризация совпадающего текста.
Флаги здесь ограничены, а группы захвата поддерживаются в виде замен.
Практическое правило простое: отключайте Regex при замене известной версии, имени файла, метки продукта или фрагмента предложения. В буквальном режиме специальные символы автоматически экранируются, сохраняя знаки препинания, идентифицирующие цель. Включайте Regex только тогда, когда вы можете указать, какой вариант должен принимать шаблон и почему точного поиска недостаточно.
Прежде чем зафиксировать отредактированные примечания к выпуску, сравните полученное количество с ожидаемым количеством изменений и проверьте результат. ToolAcre оставляет недействительные шаблоны нетронутыми и обеспечивает отмену действия для допустимого шаблона, который зашел слишком далеко. Эти меры предосторожности помогают, но выбор буквального режима для буквальной работы предотвращает широкое соответствие до того, как оно произойдет.