Текст и повседневные инструменты · Текстовый инструментарий
Почему ^ и $ совпадают только один раз: флаги регулярных выражений в браузере находят и заменяют
· Как это работает
регулярные выражения найти и заменить очистка текста
Объясняет флаги регулярных выражений JavaScript — глобальные, многострочные и dotAll — и почему поле поиска и замены компилируется без многострочных привязок ^ и $ ко всему тексту, а вместо этого работают шаблоны.
Шаблон, который исправляет только первую строку — что происходит, когда вы ожидаете, что ^ будет означать «начало каждой строки»
Вставленный список может содержать один и тот же нежелательный префикс в каждой строке, но поиск `^prefix` удаляет его только из первой строки. Удивительный результат достигается благодаря конфигурации шаблона, а не противоречивым данным. В ToolAcre `^` определяет начало полного текста, поскольку регулярное выражение компилируется без многострочного режима.
Соответствующий якорь `$` следует тому же правилу на другом краю: он идентифицирует конец всего текста, а не каждую строку, заканчивающуюся внутри него. Разрыв строки остается частью ввода, но не становится еще одной позицией привязки. Прежде чем импортировать очищенный список, проверьте зарегистрированное количество замен; счет один немедленно выявляет несоответствие.
Флаг g — почему «замена каждого совпадения за один проход» зависит от установленного глобального флага
ToolAcre всегда создает свой шаблон поиска с помощью глобального флага `g`. Этот выбор указывает JavaScript собирать все непересекающиеся совпадения, а не останавливаться после первого. Инструмент сначала вызывает `match` для определения счетчика, затем передает тот же глобальный шаблон `replace`, поэтому отображаемый номер и проход замены используют одно правило сопоставления.
Глобальное сопоставление не может создавать позиции, которые не распознает шаблон. При использовании `^prefix` есть только одно подходящее начало всего текста, поэтому `g` все равно находит одно совпадение. Если шаблон может встречаться в нескольких строках, `g` позволяет заменять все вхождения. Разделите эти вопросы при отладке: привязки решают, где может начаться совпадение, а глобальный режим решает, будет ли продолжаться поиск.
Флаг m — как многострочный режим меняет ^ и $ с привязки целого текста на привязки к строке и почему этот инструмент его игнорирует.
Многострочный флаг `m` изменяет способ интерпретации `^` и `$`, позволяя им распознавать позиции вокруг ограничителей строк, а также внешних границ текста. ToolAcre не добавляет этот флаг. Его компилятор использует `g` для поиска с учетом регистра и `gi`, когда чувствительность к регистру очищена, без пользовательского контроля над дополнительными флагами.
Если оставить многострочный режим недоступным, интерфейс будет небольшим, но это означает, что шаблоны, скопированные из редактора, настроенного с помощью `gm`, могут вести себя здесь по-другому. Не думайте, что знакомое выражение несет в себе свои флаги. Буквы флагов JavaScript предоставляются при создании RegExp, и этот инструмент отклоняет неподдерживаемый встроенный синтаксис флагов, а не автоматически включает другой режим.
Флаг s — почему точка по умолчанию не соответствует новой строке и как без нее сопоставлять разные строки
Точка в этом инструменте не соответствует разрыву строки, поскольку компилятор также опускает флаг dotAll `s`. Такой шаблон, как `BEGIN.*END`, может соответствовать, когда оба маркера находятся на одной строке, но он останавливается на первом разрыве строки, когда маркеры занимают несколько строк. Добавление глобального режима не меняет того, что может потреблять сама точка.
Если действительно необходимо совпадение между строками, укажите разрешенные символы явно. Такой класс, как `[\s\S]*?`, может охватывать как пробельные, так и непробельные символы, оставаясь при этом неохотным, хотя общие шаблоны заслуживают сначала тестирования на небольшой выборке. Компилятор обнаруживает недопустимый синтаксис, но не защищает вкладку от дорогостоящего выражения с серьезным возвратом.
Явное сопоставление новых строк — использование \n в шаблоне для начала и завершения целевой строки, когда многострочная строка недоступна.
Для повторяющегося начала строки без многострочного режима сопоставьте либо начало текста, либо новую строку: `(^|\n)prefix`. Первый вариант обрабатывает первую строку, а второй обрабатывает последующие строки, используя предшествующую им новую строку. Круглые скобки фиксируют любую совпавшую границу, давая при замене возможность сохранить структуру, разделяющую строки.
Этот метод предполагает наличие в шаблоне разделителей перевода строки. Текстовая библиотека распознает CRLF, LF и одиночный CR при выполнении операций с выделенной строкой, но функция find и replace выполняет поиск непосредственно в исходной строке. Если вставленный контент использует другую форму окончания строки, сначала нормализуйте ее или сознательно адаптируйте выражение; в противном случае последующие строки могут остаться нетронутыми, хотя на экране они выглядят одинаково.
Явно сопоставьте границы строк с (^|\n) и сохраните захваченный разделитель.
Предположим, что входные данные — `ID: apple`, `ID: pear` и `ID: plum` в отдельных строках. Включите Regex, найдите `(^|\n)ID: ` и замените его на `$1`. В первой строке `$1` — пустая начальная позиция; в более поздних строках это захваченная новая строка. Метки исчезнут, а все три границы строк останутся на месте.
Прежде чем принять результат, прочтите количество замен. В этом примере три строки должны дать три замены. Если счет равен единице, проверьте фактический образец и окончания строк, а не повторяйте операцию. Отмена доступна после замены, поэтому небольшая пробная попытка может подтвердить как сопоставление, так и реконструкцию, прежде чем то же самое выражение коснется более длинного списка импорта.
Чего это не касается — флаги u, i и y, а также вставку новой строки в замену, чего не может сделать однострочное поле.
Реализация также использует `i`, когда чувствительность к регистру отключена, но не предоставляет элементов управления для `u`, `y`, `m` или `s`. В этой статье не назначается поведение этих недоступных режимов, кроме объяснения отсутствующих эффектов multiline и dotAll, необходимых для примера. Шаблоны из другой среды JavaScript необходимо проверять на предмет флагов, которые ToolAcre фактически компилирует.
Источник доказывает, что текст замены передается в JavaScript `String.replace`, поэтому такие замены, как `$1`, `$&` и `$$`, сохраняют свои значения JavaScript. Он не устанавливает каждое взаимодействие, предлагаемое отображаемым полем из используемых здесь файлов. В частности, вставку физических символов новой строки через интерфейс следует тестировать, а не делать выводы только из структуры.
Другие флаги и поведение полей замены находятся за пределами реализации этого инструмента.
Рассматривайте флаги как часть регулярного выражения, даже если интерфейс отображает только тело шаблона. В ToolAcre каждый поиск является глобальным, дополнительный режим без учета регистра добавляет `i`, а многострочный и dotAll отсутствуют. Эти факты объясняют, почему замена продолжается в обычных совпадениях, в то время как `^`, `$` и dot сохраняют свои полнотекстовые и однострочные ограничения по умолчанию.
Для вставленного списка с префиксом `(^|\n)prefix` с `$1` является практичным обходным решением, поскольку он называет границу и сохраняет ее. Начните с репрезентативных строк, подтвердите подсчет, проверьте полученную структуру строк и только затем обработайте полный набор данных. Эта процедура превращает загадочный результат с одним совпадением в проверяемый этап очистки перед импортом.