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

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

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

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

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

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

На вашем цвете появится кодовый ключ доступа.

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

Как получилось, в первом примере мы используем \b разделять cat и во втором использовании \B разделять -? С помощью \b во втором примере происходит противоположное тому, что было сделано ранее.

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

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

10 ответов

Решение

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

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

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

\b является границей слова нулевой ширины. В частности:

Соответствует позиции между символом слова (что-либо, совпадающее с \ w) и несловесным символом (что-либо, совпадающее с [^\w] или \W), а также в начале и / или конце строки, если первый и / или последние символы в строке являются символами слова.

Пример: .\b Матчи c в abc

\B является границей неслова нулевой ширины. В частности:

Соответствует положению между двумя символами слова (т.е. положением между \w\w), а также положением между двумя несловесными символами (то есть \W\W).

Пример: \B.\B Матчи b в abc

Смотрите регулярные выражения для большей информации о регулярных выражениях.

С другим примером:

Учтите, что строка и шаблон для поиска - это "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"

Надеюсь это поможет:)

Метасимвол \b является якорем, похожим на каретку и знак доллара. Он совпадает в позиции, которая называется "граница слова". Это совпадение нулевой длины.

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

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

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

Источник: http://www.regular-expressions.info/wordboundaries.html

Источник © 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 во встроенной ситуации, например, в сертификате, соме или коте, но не самостоятельно.

\b используется как граница слова

word = "categorical cat"

Найдите все "кошки" в указанном выше слове

без \b

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

с \b

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

\b соответствует границе слова. \B соответствует границам без слов и эквивалентно [^\b](?!\b) (спасибо Alan Moore за исправление!). Оба имеют нулевую ширину.

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

Давайте возьмем строку вроде:

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 -

Как упоминалось в https://www.regular-expressions.info/wordboundaries.html :

Есть три разных положения, которые считаются границами слов для :

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

Чтобы лучше понять , я хотел бы рассмотреть строку, поставив на ней границы слов с помощью стрелок.

Нажмите на эту ссылку для визуализации массива строки - «КОШКА РАЗБРОСА».

Нажмите на эту ссылку для визуализации массива строки - "ДЕВЯТИЦИФРНЫЙ ЦВЕТ - ЗАКОДИРОВАННЫЙ ПАРОЛЬ"

В строкеTHE CAT SCATTERED

  • Граница слова at назначается в соответствии с указанным выше.

  • Граница слова наindex 16присваивается, следуя .

  • Границы слов наindices 2, 4, 6 and 8назначаются, следуя .

В строкеTHE NINE-DIGIT COLOR - CODED PASS-KEY

  • Граница слова наindex 0назначается следующимcondition 1.

  • Все остальные границы слов назначаются, следуяcondition 3. Обратите внимание, что поскольку строка заканчивается символом '.' (который не является словесным символом),condition 2не применяется.

Аналогичную визуализацию массива можно выполнить для границы без слов, используя следующее условие:

(Кредиты: проверьте ответ @Ganesh M S на тот же вопрос)

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

  1. Когда ни одна из сторон не является символом слова (т. е. когда обе стороны\W), например, в любой позиции строки $=(@-%++) (включая начало и конец строки)
  2. Когда обе стороны являются символом слова\w, например, между H и i в Hi!

\B не \b например, отрицательный \b

pass-key здесь нет границы слова - так что это соответствует \B в вашем первом примере есть граница слова рядом с кошкой, так что это соответствует \b

аналогичные правила распространяются и на других. \W отрицательно \w\UPPER CASE отрицательно \LOWER CASE

Другие вопросы по тегам