Разница между метасимволами регулярных выражений \ w и \ b

143

Может ли кто-нибудь объяснить разницу между метасимволами \bи \wрегулярными выражениями? Насколько я понимаю, оба этих метасимвола используются для обозначения границ слов. Кроме того, какой метасимвол эффективен для многоязычного контента?

Махендер
источник
11
\wпредставляет символ слова , а \bпредставляет границу слова между символом слова и символом, не являющимся словом. Это не одно и то же.
BoltClock

Ответы:

262

Метасимвол \b- это якорь, такой как каретка и знак доллара. Он соответствует позиции, называемой «границей слова» . Это совпадение нулевой длины.

Существуют три различных положения, которые квалифицируются как границы слова:

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

Проще говоря: \bпозволяет выполнять поиск «только слова целиком» с использованием регулярного выражения в форме \bword\b. «Буквенный символ» является символом , который может быть использован для образования слов. Все символы, которые не являются "словесными символами", являются "несловесными символами" .

Во всех вариантах символы [a-zA-Z0-9_]являются словесными символами. Им также соответствует класс сокращенных символов \w. Ароматизаторы, показывающие «ascii» для границ слов при сравнении вкусов, распознают только эти символы как символы слова.

\wобычно означает "словесный символ"[A-Za-z0-9_] . Обратите внимание на наличие символа подчеркивания и цифр.

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

\Wявляется сокращением [^\w]от отрицательной версии \w.

Ωmega
источник
21

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

\wматчи a, b, c, d, e, и fв "abc def"
\bматчах (нулевая ширина) положение до того a, после того, как cперед dи после того, как fв"abc def"

См .: http://www.regular-expressions.info/reference.html/

Jwismar
источник
3
Правильнее сказать, что это граница между символом слова, а не символом слова, потому что он также совпадает между символом слова и началом или концом строки, если этот символ находится в начале / конце строки.
MRAB
5
Это все еще не совсем так. \bутверждение нулевой ширины; он не соответствует символу , он соответствует позиции .
Алан Мур,
11

@Mahender, вы, наверное, имели в виду разницу между \W(вместо\w ) и \b. Если нет, то я соглашусь с @BoltClock и @jwismar выше. В противном случае продолжайте чтение.

\Wбудет соответствовать любому символу, не являющемуся словом, поэтому его легко попытаться использовать для соответствия границам слова. Проблема в том, что он не соответствует началу или концу строки. \bбольше подходит для сопоставления границ слова, так как он также соответствует началу или концу строки. Грубо говоря (более опытные пользователи могут меня здесь поправить) \bможно представить как (\W|^|$). [Edit: как @ Ωmega упоминает ниже, \bэто совпадение нулевой длины, поэтому (\W|^|$)это не совсем правильно, но, надеюсь, поможет объяснить разницу]

Быстрый пример: Для строки Hello World, .+\Wбудет соответствовать Hello_(с пространством) , но не будет соответствовать World. .+\bбудет соответствовать обоим Helloи World.

мтарик
источник
Я не согласен \bс тем, что означает то же, что и (\W|^|$), поскольку (\W|^|$)будет включать в результат сопоставления символ, не являющийся словом. Вы можете проверить этот факт здесь => regexr.com/3qf98 .
Victor
\bдля меня означает то же самое, что и (?<=\W|^|$)при использовании перед узором, и (?=\W|^|$)при использовании после узора. Вы можете проверить, о чем я говорю, здесь => regexr.com/3qf9h . Просто сравните с результатом \bякорей прямо здесь => regexr.com/3qf9t
Victor
4
\b <= this is a word boundary.

Соответствует позиции, за которой следует символ слова, но не предшествует символ слова, или которой предшествует символ слова, но не следует символ слова.

\w <= stands for "word character". 

Он всегда соответствует символам ASCII [A-Za-z0-9_]

Есть ли что-то конкретное, что вы пытаетесь сопоставить?

Несколько полезных веб-сайтов с регулярными выражениями для начинающих или просто для того, чтобы подогреть аппетит.

Я нашел эту книгу очень полезной:

Джеймс Эманон
источник
5
Это хороший ответ, но полезно помнить, что \wон не всегда эквивалентен символам ASCII [A-Za-z0-9_]- он также будет соответствовать буквенно-цифровым кодовым точкам Unicode и может соответствовать 8-битным символам ISO-Latin-1, если языковой стандарт установлен соответствующим образом .
Тим Пирс
2

\wэто не является граница слова, она соответствует любому символу, включая подчеркивание: [a-zA-Z0-9_]. \b является границей слова, то есть соответствует положению между словом и не буквенно-цифровым символом: \Wили [^\w].

Однако эти реализации могут отличаться от языка к языку.

Хулиан Урбано
источник