W3docs

Граница слова в регулярных выражениях JavaScript (\b)

В регулярных выражениях JavaScript якорь \b используется для поиска границ слова — позиций между словесными и несловесными символами.

Введение в границы слов

В JavaScript регулярных выражениях якорь \b используется для поиска границ слова. Граница слова — это позиция между словесным символом (определяемым классом символов \w, который включает [a-zA-Z0-9_]) и несловесным символом (любым символом, который не является словесным). Это позволяет точно находить целые слова и особенно полезно для таких задач, как поиск, замена или валидация конкретных словесных шаблонов в тексте.

\b является одним из якорей регулярных выражений. В отличие от якорей начала и конца строки ^ и $, которые привязывают совпадение к краям входной строки, \b привязывает его к краям слова — поэтому один шаблон может находить целые слова в любом месте строки.

В этой главе рассматривается, что считается границей слова, как работает противоположный якорь \B, нулевая ширина обоих якорей, распространённые шаблоны для поиска целых слов и ограничения при работе с текстом Unicode.

Использование якоря \b

Якорь \b является утверждением нулевой ширины: он соответствует позиции, а не символу. Позиция должна находиться между словесным символом (совпадающим с \w: [a-zA-Z0-9_]) и несловесным символом — либо между словесным символом и самым началом или концом строки. Поскольку \b имеет нулевую ширину, он ничего не потребляет; он лишь ограничивает место, в котором разрешено совпадение остальной части шаблона.

Граница слова возникает в трёх местах:

  • Перед первым символом, если этот символ является словесным.
  • После последнего символа, если этот символ является словесным.
  • Между двумя соседними символами, где ровно один из них является словесным.

Дополнительный якорь \B соответствует каждой позиции, которая не является границей слова.

Чтобы увидеть, где именно находятся границы, вставьте маркер в каждую позицию \b:

javascript— editable

Пояснение: Четыре границы находятся: перед a, после c (рядом с пробелом), перед d и после f (конец строки). Позиция пробела не имеет границы, потому что ни одна из сторон не является словесным символом.

Пример: поиск целых слов

javascript— editable

Пояснение:

  • Регулярное выражение /\bcat\b/ ищет слово "cat" как целое слово.
  • В строке 'The cat is here.' слово "cat" является отдельным словом, поэтому результат — true.
  • В строке 'The caterpillar is here.' "cat" является частью слова "caterpillar", поэтому результат — false.

Пример: поиск целых слов в тексте

javascript— editable

Пояснение:

  • Регулярное выражение /\bcat\b/g находит все вхождения слова "cat" как целого слова в тексте.
  • Оно совпадает только с "cat", но не со "scatter", "caterpillar" или "catfish", поскольку "cat" не является отдельным словом в этих контекстах.
  • Результатом является array, содержащий ["cat"].

Не-границы слов (\B)

\B является точной противоположностью \b: он соответствует любой позиции, которая не является границей слова. Это значит, что он срабатывает в середине слова (между двумя словесными символами) или между двумя несловесными символами, и не срабатывает там, где срабатывает \b.

Используйте \B, когда нужно найти шаблон только в случае, когда он вложен внутри более длинного слова.

javascript— editable

Пояснение:

  • /\Boo\B/g требует не-границы с обеих сторон от oo.
  • В 'noon' символы oo окружены n с обеих сторон, поэтому оба утверждения \B выполняются — совпадение найдено.
  • В 'zoo' символы oo находятся в конце слова, поэтому там существует настоящая граница слова, и \B не срабатывает. Возвращается только oo из 'noon'.

Удобный способ запомнить связь: в каждой позиции срабатывает ровно одно из \b и \B.

Практическое применение

Валидация полей ввода

Границы слов могут быть полезны для валидации полей ввода, когда требуются точные совпадения со словами.

javascript— editable

Пояснение:

  • Регулярное выражение /^\w+$/ гарантирует, что ввод является одним словом без пробелов.
  • ^ фиксирует начало строки, а $ — конец. Поскольку \w соответствует только словесным символам, ^ и $ неявно обеспечивают границы слова, делая \b здесь избыточным.
  • \w+ соответствует одному или более словесным символам (включая буквы, цифры и знаки подчёркивания).
  • 'user123' совпадает, потому что это одно слово без пробелов.
  • 'user 123' не совпадает, потому что содержит пробел, нарушающий последовательность словесных символов.
  • Обратите внимание, что \w включает знаки подчёркивания, что может влиять на логику валидации, если вы намерены их исключить.

Извлечение слов из предложения

Вы можете извлекать конкретные слова из предложения с помощью границ слов.

javascript— editable

Пояснение:

  • Шаблон /\btest\w*\b/gi находит любое слово, начинающееся с "test".
  • Флаг g гарантирует возврат всех совпадений в строке.
  • Флаг i обеспечивает нечувствительность к регистру, поэтому находятся как "test", так и "Testing".
  • Результат — ["test", "Testing"], так как оба слова начинаются с "test" и за ними следует ноль или более словесных символов.

Сочетание границ слов с другими шаблонами

Границы слов можно сочетать с другими шаблонами регулярных выражений для более сложных совпадений.

Пример: поиск слов с префиксом

javascript— editable

Пояснение:

  • Регулярное выражение /\bpre\w*\b/g находит слова, начинающиеся с префикса "pre".
  • \bpre фиксирует границу слова, за которой следует "pre".
  • \w* соответствует нулю или более словесным символам.
  • \b фиксирует границу слова в конце.
  • Результатом является array, содержащий ["preheat", "prefix", "prepare", "pressure"].

Пример: поиск слов с определённым суффиксом

javascript— editable

Пояснение:

  • Регулярное выражение /\w+ing\b/g находит слова, оканчивающиеся на "ing".
  • \w+ соответствует одному или более словесным символам.
  • ing\b соответствует "ing", за которым следует граница слова.
  • Результатом является array, содержащий ["running", "walking", "talking", "thinking"].
Информация

Когда вам нужно найти целые слова или убедиться, что слова не являются частью более длинных строк, используйте якорь \b для точного определения границ слов

Используйте \b для точного поиска слов

javascript— editable

Пояснение:

  • Регулярное выражение /\bdog\b/g находит слово "dog" как целое слово.
  • Оно не находит "dogs", потому что "dog" не является отдельным словом в этом контексте.
  • Результатом является array, содержащий ["dog"].

Пример: поиск целых чисел

Поскольку цифры являются словесными символами, \b работает и с числами — это полезно для извлечения целых чисел из смешанного текста без разбиения по десятичной точке.

javascript— editable

Пояснение:

  • /\b\d+\b/g находит последовательности цифр, стоящие отдельно между нецифровыми символами.
  • 3.14 разбивается на "3" и "14", потому что . является несловесным символом, и граница слова находится по обе стороны от него.

Ограничения при работе с Unicode

Якорь \b определён исключительно в терминах ASCII-набора \w ([a-zA-Z0-9_]). Буквы с диакритическими знаками или символы из нелатинских систем письма считаются несловесными символами, поэтому граница появляется там, где вы этого не ожидаете.

javascript— editable

Пояснение:

  • é не входит в \w, поэтому движок видит границу слова между caf и é.
  • \b после é ожидает, что é является словесным символом — но это не так — и потому всё утверждение не выполняется, даже если в тексте явно содержится слово "café".

JavaScript не предоставляет Unicode-совместимой версии \b (флаги u и v не изменяют его определение). Если вам нужно находить слова с ударениями или из нелатинских алфавитов как целые слова, постройте собственные границы с помощью явного класса символов, например:

javascript— editable

Пояснение:

  • \p{L} (включается флагом u) соответствует любой букве Unicode.
  • Ретроспективная проверка (?<![\p{L}]) и предпросмотр (?![\p{L}]) воссоздают границу, учитывающую буквы, поэтому café совпадает, а cafés — нет.
  • Это стандартное решение, когда ASCII \b слишком ограничен для вашего алфавита.

Заключение

Якорь \b в регулярных выражениях JavaScript — мощный инструмент для поиска границ слов. Используя этот якорь, вы можете создавать точные и эффективные шаблоны для поиска, замены и валидации слов в тексте. Независимо от того, работаете ли вы над функцией поиска, валидацией данных или обработкой текста, понимание и использование границ слов значительно расширит ваши возможности работы с регулярными выражениями.

Практика

Практика
Для чего используется граница слова '\b' в JavaScript?
Для чего используется граница слова '\b' в JavaScript?
Was this page helpful?