Разница между \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-
Примечание. В этом случае символ подчеркивания (_) не считается специальным символом.
/\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-
/\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-
/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 - -
/\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-
/\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 -
/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-
/\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-
/\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 :
Есть три разных положения, которые считаются границами слов для :
- Перед первым символом в строке, если первый символ является символом слова.
- После последнего символа в строке, если последний символ является символом слова.
- Между двумя символами в строке, где один является символом слова, а другой не является символом слова.
Чтобы лучше понять , я хотел бы рассмотреть строку, поставив на ней границы слов с помощью стрелок.
Нажмите на эту ссылку для визуализации массива строки - «КОШКА РАЗБРОСА».
Нажмите на эту ссылку для визуализации массива строки - "ДЕВЯТИЦИФРНЫЙ ЦВЕТ - ЗАКОДИРОВАННЫЙ ПАРОЛЬ"
В строке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
не совпадает, т.е.:
- Когда ни одна из сторон не является символом слова (т. е. когда обе стороны
\W
), например, в любой позиции строки $=(@-%++) (включая начало и конец строки)- Когда обе стороны являются символом слова
\w
, например, между H и i в Hi!
\B
не \b
например, отрицательный \b
pass-key
здесь нет границы слова -
так что это соответствует \B
в вашем первом примере есть граница слова рядом с кошкой, так что это соответствует \b
аналогичные правила распространяются и на других. \W
отрицательно \w
\UPPER CASE
отрицательно \LOWER CASE