Граница слова в регулярных выражениях 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:
Пояснение: Четыре границы находятся: перед a, после c (рядом с пробелом), перед d и после f (конец строки). Позиция пробела не имеет границы, потому что ни одна из сторон не является словесным символом.
Пример: поиск целых слов
Пояснение:
- Регулярное выражение
/\bcat\b/ищет слово "cat" как целое слово. - В строке
'The cat is here.'слово "cat" является отдельным словом, поэтому результат —true. - В строке
'The caterpillar is here.'"cat" является частью слова "caterpillar", поэтому результат —false.
Пример: поиск целых слов в тексте
Пояснение:
- Регулярное выражение
/\bcat\b/gнаходит все вхождения слова "cat" как целого слова в тексте. - Оно совпадает только с "cat", но не со "scatter", "caterpillar" или "catfish", поскольку "cat" не является отдельным словом в этих контекстах.
- Результатом является array, содержащий
["cat"].
Не-границы слов (\B)
\B является точной противоположностью \b: он соответствует любой позиции, которая не является границей слова. Это значит, что он срабатывает в середине слова (между двумя словесными символами) или между двумя несловесными символами, и не срабатывает там, где срабатывает \b.
Используйте \B, когда нужно найти шаблон только в случае, когда он вложен внутри более длинного слова.
Пояснение:
/\Boo\B/gтребует не-границы с обеих сторон отoo.- В
'noon'символыooокруженыnс обеих сторон, поэтому оба утверждения\Bвыполняются — совпадение найдено. - В
'zoo'символыooнаходятся в конце слова, поэтому там существует настоящая граница слова, и\Bне срабатывает. Возвращается толькоooиз'noon'.
Удобный способ запомнить связь: в каждой позиции срабатывает ровно одно из \b и \B.
Практическое применение
Валидация полей ввода
Границы слов могут быть полезны для валидации полей ввода, когда требуются точные совпадения со словами.
Пояснение:
- Регулярное выражение
/^\w+$/гарантирует, что ввод является одним словом без пробелов. ^фиксирует начало строки, а$— конец. Поскольку\wсоответствует только словесным символам,^и$неявно обеспечивают границы слова, делая\bздесь избыточным.\w+соответствует одному или более словесным символам (включая буквы, цифры и знаки подчёркивания).'user123'совпадает, потому что это одно слово без пробелов.'user 123'не совпадает, потому что содержит пробел, нарушающий последовательность словесных символов.- Обратите внимание, что
\wвключает знаки подчёркивания, что может влиять на логику валидации, если вы намерены их исключить.
Извлечение слов из предложения
Вы можете извлекать конкретные слова из предложения с помощью границ слов.
Пояснение:
- Шаблон
/\btest\w*\b/giнаходит любое слово, начинающееся с "test". - Флаг
gгарантирует возврат всех совпадений в строке. - Флаг
iобеспечивает нечувствительность к регистру, поэтому находятся как "test", так и "Testing". - Результат —
["test", "Testing"], так как оба слова начинаются с "test" и за ними следует ноль или более словесных символов.
Сочетание границ слов с другими шаблонами
Границы слов можно сочетать с другими шаблонами регулярных выражений для более сложных совпадений.
Пример: поиск слов с префиксом
Пояснение:
- Регулярное выражение
/\bpre\w*\b/gнаходит слова, начинающиеся с префикса "pre". \bpreфиксирует границу слова, за которой следует "pre".\w*соответствует нулю или более словесным символам.\bфиксирует границу слова в конце.- Результатом является array, содержащий
["preheat", "prefix", "prepare", "pressure"].
Пример: поиск слов с определённым суффиксом
Пояснение:
- Регулярное выражение
/\w+ing\b/gнаходит слова, оканчивающиеся на "ing". \w+соответствует одному или более словесным символам.ing\bсоответствует "ing", за которым следует граница слова.- Результатом является array, содержащий
["running", "walking", "talking", "thinking"].
Когда вам нужно найти целые слова или убедиться, что слова не являются частью более длинных строк, используйте якорь \b для точного определения границ слов
Используйте \b для точного поиска слов
Пояснение:
- Регулярное выражение
/\bdog\b/gнаходит слово "dog" как целое слово. - Оно не находит "dogs", потому что "dog" не является отдельным словом в этом контексте.
- Результатом является array, содержащий
["dog"].
Пример: поиск целых чисел
Поскольку цифры являются словесными символами, \b работает и с числами — это полезно для извлечения целых чисел из смешанного текста без разбиения по десятичной точке.
Пояснение:
/\b\d+\b/gнаходит последовательности цифр, стоящие отдельно между нецифровыми символами.3.14разбивается на"3"и"14", потому что.является несловесным символом, и граница слова находится по обе стороны от него.
Ограничения при работе с Unicode
Якорь \b определён исключительно в терминах ASCII-набора \w ([a-zA-Z0-9_]). Буквы с диакритическими знаками или символы из нелатинских систем письма считаются несловесными символами, поэтому граница появляется там, где вы этого не ожидаете.
Пояснение:
éне входит в\w, поэтому движок видит границу слова междуcafиé.\bпослеéожидает, чтоéявляется словесным символом — но это не так — и потому всё утверждение не выполняется, даже если в тексте явно содержится слово "café".
JavaScript не предоставляет Unicode-совместимой версии \b (флаги u и v не изменяют его определение). Если вам нужно находить слова с ударениями или из нелатинских алфавитов как целые слова, постройте собственные границы с помощью явного класса символов, например:
Пояснение:
\p{L}(включается флагомu) соответствует любой букве Unicode.- Ретроспективная проверка
(?<![\p{L}])и предпросмотр(?![\p{L}])воссоздают границу, учитывающую буквы, поэтомуcaféсовпадает, аcafés— нет. - Это стандартное решение, когда ASCII
\bслишком ограничен для вашего алфавита.
Заключение
Якорь \b в регулярных выражениях JavaScript — мощный инструмент для поиска границ слов. Используя этот якорь, вы можете создавать точные и эффективные шаблоны для поиска, замены и валидации слов в тексте. Независимо от того, работаете ли вы над функцией поиска, валидацией данных или обработкой текста, понимание и использование границ слов значительно расширит ваши возможности работы с регулярными выражениями.