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


103

Я читаю книгу по регулярным выражениям и наткнулся на этот пример для \b:

Кот разбросал свою еду по комнате.

Использование регулярного выражения - \bcat\bбудет соответствовать слову, catно не catin scattered.

Для \Bавтора используется следующий пример:

Пожалуйста, введите девятизначный идентификатор, поскольку он

появляется на вашем цветном коде доступа.

Использование регулярных выражений для \B-\Bсовпадений -между словом color - coded. Использование, \b-\bс другой стороны, соответствует -in nine-digitи pass-key.

Почему в первом примере мы используем \bдля разделения, catа во втором - \Bдля разделения -? Использование \bво втором примере делает противоположное тому, что было раньше.

Пожалуйста, объясните мне разницу.

РЕДАКТИРОВАТЬ: Кроме того, может ли кто-нибудь объяснить новый пример?

Ответы:


84

Путаница возникает из-за того, что ваше мышление \bсоответствует пробелам (вероятно, потому, что «b» предполагает «пробел»).

\bсоответствует пустой строке в начале или в конце слова . \Bсоответствует пустой строке не в начале и не в конце слова. Ключевым моментом здесь является то, что «-» не является частью слова. Таким образом <left>-<right>совпадает, \b-\bпотому что есть границы слов по обе стороны от -. С другой стороны для <left> - <right>(обратите внимание на пробелы), нет границ слов по обе стороны от тире. Границы слова проходят на один пробел влево и вправо.

С другой стороны, при поиске \bcat\bграниц слова ведите себя более интуитивно, и он соответствует слову «кошка», как и ожидалось.


2
Да, я действительно перепутал \ b с пробелом. Однако я все еще немного сбит с толку. Могу я попросить вас привести еще один пример?
stiredo

3
Ключ в том, что -это не считается частью слова. Точно так же !не является частью слова. Так что снова \b!\bсоответствует «uunet! Iamold», но не «Wow! You are». Вы можете попробовать это на 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
Арун Гауда

69

\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 по регулярным выражениям при переполнении стека в разделе «Якоря».
aliteralmind

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

1
Я думаю, это лучший ответ. Я также должен быть принятым, потому что это разрешает путаницу. Здесь можно узнать гораздо больше.
Волк

39

Другой пример:

Учтите, что это строка, а образец, который нужно искать, - это 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");

Теперь результат "catmania thisct thiscatmaina"

Случай 3: Не в начале

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

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

Случай 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 is my cat" => первое слово (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).
Алан Мур

@ Алан, спасибо, вы совершенно правы - я не проснулся сегодня утром, когда писал это. Исправлена.
Matt Ball

4
... но почему кто-то хотел бы сопоставить backspace, не понимаю. : 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Должен начинаться и не заканчиваться специальным символом или пробелом

Икс 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 будет соответствовать коту в черном коте, но не будет соответствовать ему в кататоническом, коте или сертификате. Если удалить одну из границ, \ bcat будет соответствовать cat в catfish, а cat \ b будет соответствовать cat в tomcat, но не наоборот. Оба, конечно же, сами по себе соответствовали бы кошке.

Не-слово-граница: \ B

\ B соответствует всем позициям, где \ b не соответствует. Следовательно, он соответствует:

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

✽ Когда обе стороны представляют собой символ слова, например между H и i в Hi!

Это может показаться не очень полезным, но иногда \ B - это именно то, что вам нужно. Например,

✽ \ Bcat \ B обнаружит, что кошка полностью окружена словесными символами, как в сертификате, но не сама по себе, ни в начале, ни в конце слов.

✽ cat \ B найдет кота и в сертификате, и в соме, но ни в коте, ни отдельно.

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

✽ \ Bcat | cat \ B найдет cat во встроенной ситуации, например, в сертификате, соме или коте, но не самостоятельно.


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.