Різниця між \ b і \ B в регулярному виразі


103

Я читаю книгу з регулярним виразом і натрапив на цей приклад для \b:

Кіт розкидав свою їжу по всій кімнаті.

Використання регулярного вираження - \bcat\bвідповідатиме слову, catале не catвводу scattered.

Для \Bавтора використовується такий приклад:

Будь ласка, введіть як дев'ятизначний ідентифікатор

з'явиться на вашому кольорі - закодований ключ пропуску.

Використання регулярних \B-\Bзбігів -між словом color - coded. Використання \b-\bз іншого боку відповідає і -в nine-digitі pass-key.

Як у першому прикладі ми використовуємо \bдля розділення, catа у другому - \Bдля розділення -? Використання \bу другому прикладі робить протилежне тому, що було зроблено раніше.

Будь ласка, поясніть мені різницю.

EDIT: Також, будь-хто, будь-ласка, може пояснити з новим прикладом?

Відповіді:


84

Плутанина випливає з вашої думки, яка \bвідповідає просторам (можливо, тому, що "b" пропонує "порожнє").

\bвідповідає порожньому рядку на початку або в кінці слова . \Bвідповідає порожньому рядку не на початку або в кінці слова. Ключовим тут є те, що "-" не є частиною слова. Таким чином, <left>-<right>збігається, \b-\bтому що є межі слів по обидва боки від -. З іншого боку для <left> - <right>(відзначте пробіли), немає жодних меж слова з обох боків тире. Межі слів - це один простір далі ліворуч та праворуч.

З іншого боку, при пошуку \bcat\bмеж слова поводяться більш інтуїтивно, і воно відповідає «коту», як очікувалося.


2
Так, я справді плутав \ b із порожнім пробілом. Однак я все ще відчуваю себе трохи розгубленим. Чи можу я попросити вас ще один приклад?
стремередо

3
Ключовим є те, що -не вважається частиною слова. Так само !не є частиною слова. Отже, знову \b!\bвідповідає "uunet! Iamold", але не "вау! Ти є". Ви можете спробувати цей матеріал на сайті regexpal.com .
andrewdski

@andrewdski У моєму випадку \ b ловить також розділові знаки ... Я намагався з \ b [A-Z0-9] + \ b 1987894, 3219800; 234567, 345261. і це працює чудово, я отримую лише номери
gunzapper

1
Просто додамо, що робота в регулярному виразі складається з літер (a - z і A - Z), цифр і "_" [підкреслення]. Все інше - це не слово.
Maralc

Може хтось розробив цю лінію\B matches the empty string not at the beginning or end of a word
Арун Гоуда

68

\bє межею слова нульової ширини. Конкретно:

Збігається на позиції між символом слова (будь-що, що відповідає \ w) та несловним символом (все, що відповідає [^ \ w] або \ W), а також на початку та / або в кінці рядка, якщо перший та / або останні символи в рядку є символами слова.

Приклад: .\bзбіги cвabc

\B- межа без слів нульової ширини. Конкретно:

Збігається у позиції між двома символами слова (тобто позицією між \ w \ w), а також позицією між двома неслововими символами (тобто \ W \ W).

Приклад: \B.\Bзбіги bвabc

Дивіться regular-expressions.info для отримання великої інформації про регулярні виразки


10
+1, оскільки нульова ширина є важливою частиною визначення. Якби вона не була нульовою шириною, вона також захопила б ці слова / несловові символи у відповідній частині шаблону.
Бен Хокінг

5
Іншими словами, \ B відповідає плямі між \ W і \ W або між \ w і \ w, але не між \ W і \ w.

1
Ця відповідь була додана до FAQ FAQ про регулярне вираження стека в розділі "Якоря".
aliteralmind

1
@stephenhuh string.match()повертає лише перший матч, якщо ви не додасте глобальний прапор g: "abc def".match(/\b./g)return['a', ' ', 'd']
Bohemian

1
Я думаю, що це краща відповідь. Я також повинен бути прийнятим, оскільки він вирішує плутанину. Тут можна дізнатися багато іншого.
Вовк

38

З іншим прикладом:

Зверніть увагу, що це рядок і шаблон, який потрібно шукати, це "cat":

text = "catmania thiscat thiscatmaina";

Тепер визначення,

'\ b' знаходить / відповідає шаблону на початку або в кінці кожного слова.

'\ B' не знаходить / не відповідає шаблону на початку або в кінці кожного слова.

Різні випадки:

Випадок 1: На початку кожного слова

result = text.replace(/\bcat/g, "ct");

Тепер результат - "ctmania thiscat thiscatmaina"

Випадок 2: В кінці кожного слова

result = text.replace(/cat\b/g, "ct");

Тепер, результат - "катманія це ця кітмайна"

Випадок 3: Не на початку

result = text.replace(/\Bcat/g, "ct");

Тепер, результат - "катманія цього аспекту"

Випадок 4: Не врешті-решт

result = text.replace(/cat\B/g, "ct");

Тепер результат - "ctmania thiscat thisctmaina"

Випадок 5: Ні початок, ні кінець

result = text.replace(/\Bcat\B/g, "ct");

Тепер результат - "catmania thiscat thisctmaina"

Сподіваюся, це допомагає :)


Виправте мене, якщо я помиляюся, будь ласка, але, використовуючи \ bcat \ b, якби це був наш рядок, наприклад: "catcat - моя кішка" => перше слово (catcat) було б застосовано до цієї умови. немає?.
Kosem

8

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

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

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

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

Джерело: http://www.regular-expressions.info/wordboundaries.html


3

\bвідповідає межі слова. \Bвідповідає немежовим словам і є рівнозначним (спасибі @Alan Moore за виправлення!) . Обидва - нульової ширини.[^\b](?!\b)

Докладні відомості див. У розділі http://www.regular-expressions.info/wordboundaries.html . Сайт надзвичайно корисний для багатьох основних питань з питань регулярного вираження.


4
\Bце НЕ еквівалентно [^\b]. Клас символів ( [...]або [^...]) споживає рівно один символ, тоді як твердження нульової ширини люблять \bі \Bнічого не споживають. Якщо ви кладете \bв клас символів, він набуває зовсім іншого значення: [\b]збігається з простором і [^\b]відповідає будь-якому символу, окрім простору. \Bдійсно рівнозначний (?!\b).
Алан Мур

@Alan спасибі, ти абсолютно правильний - я не прокинувся сьогодні вранці, коли написав це. Виправлено.
Метт Бал

4
... але чому хто-небудь хотів би співставити задній простір, поза мною. : D
Алан Мур

1

Дозвольте взяти рядок типу:

XIX IXI XX XI II IIXX XXII II XX -X X- XI IX -X- -IX -XI IX- XI- X_X _X-

Примітка: Підкреслення (_) в цьому випадку не вважається особливим символом.

  1. /\bX\b/g Починається і закінчується спеціальним символом або білим пробілом

XIX IXI XX X I II IIXX XXII II X - X - X X - X -I I- X - X - -I- X - X -I I- X - X -I- X_X _X-


  1. /\bX/g Починати слід зі спеціального символу або білого пробілу

X IX IXI X X X I II IIXX X XII II X - X - X X - X -I I- X - X - -I- X - X -I I- X - X -I- X _X _X-


  1. /X\b/g Закінчується спеціальним символом або білим пробілом

XI X IXI X X X I II IIX X XXII II X - X - X X - X -I I- X - X - -I- X - X -I I- X - X -I- X_ X _ X -


  1. /\BX\B/g
    Не повинен починатися і не закінчуватися спеціальним символом або білим пробілом

XIX I X I XX XI II II X X X X II II XX -X X- XI IX -X- -IX -XI IX- XI- X_X _X-


  1. /\BX/gНе слід починати зі спеціального символу або білого пробілу

XI X I X I X X XI II II XX X X II II XX -X X- XI IX -X- -IX -XI IX- XI- X_ X _ X -


  1. /X\B/gНе повинен закінчуватися спеціальним символом або білим пробілом

X IX I X I X X XI II II X X XX II II XX -X X- XI IX -X- -IX -XI IX- XI- X _X _X-


  1. /\bX\B/gПочинається, а не закінчується спеціальним символом або білим пробілом

X IX IXI X X XI II II X X X XII II XX -X X- XI IX -X- -IX -XI IX- XI- X _X _X-


  1. /\BX\b/gНе повинен починатися і повинен закінчуватися спеціальним символом або білим пробілом

XI X IXI X X XI II IIX X XXII II XX -X X- XI IX -X- -IX -XI IX- XI- X_ X _ X -


1

Джерело © Copyright RexEgg.com

Межа слів: \ b *

Межа слова \ b відповідає позиціям, де одна сторона є символом слова (зазвичай це літера, цифра або підкреслення; але див. Нижче для варіантів між двигунами), а інша сторона не є символом слова (наприклад, це може бути початком рядок або пробіл).

Таким чином, регулярний вираз \ bcat \ b відповідатиме кішці у чорній кішці, але це не збігається з нею у кататонічному, tomcat або сертифікаті. Видаляючи одну з меж, \ bcat відповідатиме коту в сома, а кішка \ b буде відповідати кішці в котках, але не навпаки. Обидва, звичайно, відповідали б кішці самостійно.

Межа без слова: \ B

\ B відповідає всім позиціям, де \ b не відповідають. Тому він відповідає:

✽ Коли жодна сторона не є символом слова, наприклад, у будь-якій позиції рядка $ = (@ -% ++) (включаючи початок і кінець рядка)

✽ Коли обидві сторони є символом слова, наприклад між H та i в Hi!

Це може здатися не дуже корисним, але іноді \ B - це саме те, що ви хочете. Наприклад,

✽ \ Bcat \ B знайде кішку, повністю оточену символами слова, як у сертифікаті, але ні самостійно, ні на початку, ні в кінці слів.

✽ кішка \ В знайде кота і в сертифікаті, і в сома, але ні в томатці, ні самостійно.

✽ \ Bcat знайде кота і в сертифікаті, і в томатке, але ні в сомі, ні самостійно.

✽ \ Bcat | cat \ B знайде кота у вбудованій ситуації, наприклад, у сертифікаті, сома чи кота, але не самостійно.


1

\ b використовується як межа слова

word = "categorical cat"

Знайдіть усіх «котів» у вищезгаданому слові

без \ b

re.findall(r'cat',word)
['cat', 'cat']

з \ b

re.findall(r'\bcat\b',word)
['cat']

0

\Bне є, \bнаприклад, негативним \b

pass-keyтут немає межі слів поруч, -тож вона відповідає \Bу вашому першому прикладі є межа слова біля кішки, тож вона відповідає\b

подібні правила діють і для інших. \Wнегативний \w \UPPER CASE, негативний\LOWER CASE

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