Текст и повседневные инструменты · Текстовый инструментарий
Как работает поиск по всему слову: границы слов и проблема кошки и собаки
· Как это работает
регулярное выражение найти и заменить редактирование текста
Объясняет, что такое граница слова в регулярных выражениях JavaScript, почему слово «cat» не должно совпадать внутри слова «concatenate» и почему перед добавлением границ необходимо сгруппировать чередование, например cat|dog.
Переименование, которое изменило «объединение» — почему простой поиск и замена короткого слова повреждает более длинные слова
Переименование продукта выглядит безобидным до тех пор, пока короткое имя не появится внутри несвязанных слов. Замена каждого вхождения `cat` на `lynx` изменяет `concatenate` на `conlynxenate`, хотя ни один редактор не собирался переименовывать часть этого глагола. Одно только количество совпадений не может защитить документ, если правило поиска слишком широкое.
Сопоставление всего слова сужает правило до того, как произойдет какая-либо замена. В ToolAcre включение целого слова делает доступным автономный `cat`, оставляя те же буквы внутри `concatenate` нетронутыми. Это различие структурное, а не основанное на словаре: механизм регулярных выражений проверяет символы сразу после каждого возможного совпадения.
Что означает \b — позиция нулевой ширины между символом слова и символом, не являющимся словом.
В регулярном выражении JavaScript `` отмечает границу слова нулевой ширины. Он не использует букв, пробелов и знаков препинания. Вместо этого он успешен в позиции, где одна сторона является словесным символом, а другая — нет, включая начало или конец текста, когда соседний символ квалифицируется как словесный символ.
Категория `w` JavaScript предоставляет соответствующие символы слов для этой реализации: ASCII буквы, цифры и подчеркивание. Поэтому `cat` соответствует `cat` рядом с пробелами, запятыми или концами строк, но не соответствует сегменту `cat` внутри `concatenate`, поскольку обе стороны этого сегмента продолжаются через символы слова и границы там не существует.
Целое слово в буквальном режиме — сначала искомый текст экранируется, а затем заключен в границы.
Если регулярное выражение отключено, ToolAcre сначала экранирует каждый метасимвол регулярного выражения в тексте поиска. Точка остается буквальной точкой, круглые скобки остаются буквальными круглыми скобками, а знак плюс остается знаком плюса. Только после этого шага экранирования результирующий источник переносится в целое слово, поэтому пользовательская пунктуация не может автоматически стать синтаксисом регулярного выражения.
Оболочкой является `(?:… )` без отображаемого пространства: внутренняя `(?:…)` — это группа без захвата. Для простого литерала, такого как `cat`, эффект эквивалентен `cat`. Группировка по-прежнему имеет значение, поскольку один путь компиляции должен безопасно обрабатывать простые термины и более сложные альтернативы без изменения нумерации групп захвата.
Целое слово в режиме регулярного выражения — почему кошка|собака должна быть ограничена как группа, иначе граница привязана только к одной ветке
Режим Regex оставляет введенный шаблон нетронутым, но целое слово по-прежнему группирует его перед добавлением границ. Для `cat|dog` ToolAcre компилирует концептуальную форму `(?:cat|dog)`. Таким образом, обе альтернативы должны начинаться и заканчиваться на границах слов, поэтому автономный `cat` и автономный `dog` соответствуют одному и тому же правилу.
Без этой группы `cat|dog` разделилась бы на две ветви: левая граница ограничивала бы только `cat`, а правая граница ограничивала бы только `dog`. Чередование имеет более низкий приоритет, чем окружающая его последовательность. Группировка — это то, что применяет оба граничных утверждения ко всему выбору вместо неравномерного распределения одного утверждения.
Рабочий пример — переименование продукта в документе с включенным параметром Whole word и проверка количества замен на соответствие ожиданиям.
Вставьте репрезентативный фрагмент, содержащий `cat`, `dog`, `concatenate`, `dogged` и знаки препинания, например `cat, dog.`. Введите `cat|dog`, включите регулярное выражение и целое слово и запустите «Заменить все» новым названием продукта. Два отдельных слова о животных должны измениться; более длинные слова должны оставаться такими, какими они были.
Прежде чем принять изменение, прочтите сообщенное количество замен. Если в документе есть три известные отдельные ссылки, но инструмент сообщает о двух или двенадцати, выберите «Отменить» и проверьте примеры контекстов. ToolAcre подсчитывает совпадения перед вызовом стандартной замены строки, поэтому отображаемая сумма является практической проверкой правила поиска, которое вы фактически скомпилировали.
Границы слов вас удивляют: символы слова JavaScript представляют собой ASCII буквы, цифры и подчеркивание, поэтому слова с акцентом и нелатинские слова требуют проверки.
Эти границы не реализуют многоязычный словарь или алгоритм сегментации текста Unicode. Поскольку буквы с диакритическими знаками и нелатинские буквы выходят за рамки используемой здесь категории слов в стиле ASCII, Whole word может возвращать ноль или создавать неожиданные крайние позиции для таких терминов, как `café`. Пунктуация внутри поискового запроса может вызвать такое же несоответствие.
Перед массовым редактированием проверьте точный язык и правописание, особенно для имен, содержащих диакритические знаки, апострофы или дефисы. Утверждение границы сравнивает только смежные категории символов; он не знает, образует ли типографика одно человеческое слово. Если образец не пройден, используйте специально разработанное регулярное выражение для этого окружения, а не доверяйте флажку.
Границы слов JavaScript вас удивляют: символы слов в стиле ASCII не являются лингвистическими словами.
Инструмент предоставляет отдельную опцию, учитывающую регистр, в отличие от любого предположения, что обработка регистра отсутствует в интерфейсе. При его очистке добавляется флаг нечувствительности к регистру JavaScript. Однако реализация использует только глобальное сопоставление плюс дополнительную нечувствительность к регистру; он не добавляет флаги Unicode, многострочный, точечный, липкий или другие флаги.
В этой статье также не рассматривается `` в границу с поддержкой Unicode и не решается токенизация для конкретного языка. Экранирование свойств JavaScript здесь не является заменой, поскольку инструмент не компилирует шаблоны с флагом Юникода. Для многоязычной редакционной работы создайте явные тестовые примеры и выберите шаблон, поддерживаемый используемым движком браузера.
В инструменте существуют параметры регистра; Границы слов с поддержкой Unicode не
Целое слово - это правило композиции, а не второй замены двигателя. Буквальный режим позволяет избежать поиска; режим регулярных выражений сохраняет его; тогда любой результат окружает одна и та же незахватывающая группа и две границы. Этот порядок защищает буквальную пунктуацию и заставляет альтернативы регулярных выражений, такие как `cat|dog`, вести себя как одно ограниченное выражение.
Используйте эту опцию, когда целевыми объектами являются автономные термины в стиле ASCII, а затем рассматривайте счетчик замен и элемент управления «Отмена» как защиту, а не украшение. Откройте функцию «Найти и заменить» ToolAcre, проверьте изменение как на автономных, так и на встроенных примерах и примените его к полному документу только после того, как эти примеры поведут себя должным образом.