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


142

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


11
\wявляє собою символ слова , в той час як \bявляє собою межу слова між символом слова та несловним символом. Вони не те саме.
BoltClock

Відповіді:


259

Метахарактер \b- це якор, як карета та знак долара. Він збігається у позиції, яка називається "межа слова" . Ця відповідність дорівнює нулю.

Є три різні позиції, які можна визначити як межі слів:

  • Перед першим символом у рядку, якщо перший символ є символом слова.
  • Після останнього символу в рядку, якщо останній символ є символом слова.
  • Між двома символами в рядку, де один є символом слова, а інший - символом слова.

Простіше кажучи: \bдозволяє виконувати пошук "лише цілими словами", використовуючи регулярний вираз у вигляді \bword\b. «Буквений символ» є символом , який може бути використаний для утворення слів. Усі символи, які не є "символами слова", є "символами без слів" .

У всіх ароматах символи [a-zA-Z0-9_]- це символи слова. Вони також відповідають класу символів короткої руки \w. Ароматизатори, що показують "ascii" для меж слів у порівнянні ароматів, розпізнають лише їх як символи слова.

\wозначає , що зазвичай "слово слова"[A-Za-z0-9_] . Зверніть увагу на включення підкреслення та цифр.

\Bце заперечена версія \b. \Bвідповідає на будь-якій позиції, де \bцього немає. Ефективно \Bспівпадає в будь-якій позиції між двома символами слова, а також у будь-якій позиції між двома символами, що не містять слова.

\Wскорочено для [^\w], заперечуваної версії \w.


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/


3
Правильніше сказати, що це межа між символом слова, а не символом слова, оскільки він також відповідає між символом слова і початком або кінцем рядка, якщо цей символ знаходиться на початку / в кінці рядка.
MRAB

5
Це все ще не зовсім правильно. \bтвердження нульової ширини; він не відповідає персонажу , він відповідає позиції .
Алан Мур

10

@Mahender, ви, мабуть, мали на увазі різницю між \W(а не \w) та \b. Якщо ні, то я погодився б із @BoltClock та @jwismar вище. Інакше продовжуйте читати.

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

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


Я не погоджуюсь в \bзначенні того ж самого (\W|^|$), оскільки (\W|^|$)буде містити несловесний символ всередині результату відповідності. Ви можете перевірити цей факт тут => regexr.com/3qf98 .
Віктор

\bдля мене означає те саме, що (?<=\W|^|$)коли використовується перед візерунком і (?=\W|^|$)коли використовується після шаблону. Ви можете перевірити, про що я тут говорю => regexr.com/3qf9h . Просто порівняйте з результатом якірів\b прямо тут => regexr.com/3qf9t
Віктор

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].

Ці реалізації можуть відрізнятися від мови до мови.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.