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

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

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

Использование regex - \bcat\b будет соответствовать слову cat, но не cat в scattered.

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

Введите девятизначный идентификатор, если он

появляется на вашей цветовой кодировке.

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

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

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

EDIT: Кроме того, может кто-нибудь объяснить новый пример?

Ответ 1

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

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

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

Ответ 2

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

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

Пример: .\b соответствует c в abc

\b - граница без слова без ширины. В частности:

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

Пример: \B.\B соответствует b в abc

См. regular-expressions.info для получения более подробной информации о регулярном выражении

Ответ 3

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

Рассмотрим, что строка и шаблон, которые нужно искать, это "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"

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

Ответ 4

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

В качестве границ слов существуют три разных позиции:

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

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

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

Ответ 5

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

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

Ответ 6

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

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

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

Ответ 7

Возьмем строку типа:

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

Примечание: Подчеркивание (_) в этом случае не считается специальным символом.

  • /\bX\b/g Должно начинаться и заканчиваться специальным символом или пробелом

XIX IXI XX X я 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 я 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 я 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 я X я XX XI II II X XX X II II XX-X X-XI IX -X- -IX - XI IX-XI-X_X _X-


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

XI X я X IX 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 я X я X XXI 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 XXI 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 -

Ответ 8

Источник © Copyright RexEgg.com

Граница слова:\b *

Граница слова \b соответствует позициям, где одна сторона является символом слова (обычно это буква, цифра или знак подчеркивания, но см. ниже различия между двигателями), а другая сторона не является символом слова (например, это может быть начало строка или пробел).

Следовательно, регулярное выражение \bcat\b будет соответствовать cat для черной кошки, но не будет соответствовать catatonic, tomcat или сертификату. Удаляя одну из границ, \bcat будет соответствовать cat в соме, а cat\b будет соответствовать cat в tomcat, но не наоборот. Оба, конечно, подойдут кошке самостоятельно.

Граница не слова:\B

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

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

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

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

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

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

B\Bcat найдет кошку как в сертификате, так и в коте, но не в соме и не в одиночку.

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