Diferença entre \ b e \ B em regex

103

Estou lendo um livro sobre expressão regular e me deparei com este exemplo de \b:

O gato espalhou sua comida por toda a sala.

Usando regex - \bcat\bcorresponderá à palavra, catmas não ao catin scattered.

Para \Bo autor usa o seguinte exemplo:

Por favor, insira o ID de nove dígitos, pois

aparece na sua senha codificada por cores.

Usando \B-\Bcorrespondências de regex -entre a palavra color - coded. Por \b-\boutro lado, usar corresponde a -em nine-digite pass-key.

Como é que no primeiro exemplo usamos \bpara separar cate no segundo usamos \Bpara separar -? Usar \bno segundo exemplo faz o oposto do que fez antes.

Por favor, explique a diferença para mim.

EDIT: Além disso, alguém pode explicar com um novo exemplo?

Agitado
fonte

Respostas:

84

A confusão decorre de seu pensamento \bcorresponder a espaços (provavelmente porque "b" sugere "espaço em branco").

\bcorresponde à string vazia no início ou no final de uma palavra . \Bcorresponde à string vazia, não no início ou no final de uma palavra. A chave aqui é que "-" não faz parte de uma palavra. Portanto, <left>-<right>corresponde \b-\bporque há limites de palavras em ambos os lados do -. Por outro lado, para <left> - <right>(observe os espaços), não há limites de palavras em nenhum dos lados do travessão. Os limites das palavras estão um espaço mais à esquerda e à direita.

Por outro lado, ao pesquisar \bcat\blimites de palavras, comporte-se de forma mais intuitiva e corresponda a "gato" conforme o esperado.

andrewdski
fonte
2
Sim, eu estava realmente confundindo \ b com um espaço em branco. No entanto, ainda me sinto um pouco confuso. Posso pedir mais um exemplo?
agitado em
3
A chave é que -não é considerado parte de uma palavra. Da mesma forma, !não é parte de uma palavra. Então, novamente \b!\bcorresponde a "uunet! Iamold", mas não a "Uau! Você é." Você pode tentar isso em regexpal.com .
andrewdski
@andrewdski No meu caso \ b captura também pontuações ... Tentei com \ b [A-Z0-9] + \ b em 1987894, 3219800; 234567, 345261. e funciona bem, obtenho apenas números
gunzapper
1
Apenas adicionando que um trabalho em regex é composto de letras (a– z e A– Z), dígitos e o “_” [sublinhado]). Todo o resto não é palavra.
Maralc
Alguém poderia elaborar esta linha\B matches the empty string not at the beginning or end of a word
Arun Gowda
68

\bé um limite de palavra de largura zero. Especificamente:

Corresponde na posição entre um caractere de palavra (qualquer coisa correspondida por \ w) e um caractere não-palavra (qualquer coisa correspondida por [^ \ w] ou \ W), bem como no início e / ou final da string, se o primeiro e / ou os últimos caracteres da string são caracteres de palavra.

Exemplo: .\bjogos cemabc

\Bé um limite de não palavra de largura zero. Especificamente:

Corresponde na posição entre dois caracteres de palavra (ou seja, a posição entre \ w \ w), bem como na posição entre dois caracteres não-palavra (ou seja, \ W \ W).

Exemplo: \B.\Bjogos bemabc

Consulte regular-expressions.info para mais informações excelentes de regex

Boêmio
fonte
10
+1 porque a largura zero é uma parte importante da definição. Se não fosse de largura zero, também capturaria os caracteres de palavra / não palavra na parte correspondente do padrão.
Ben Hocking
5
Em outras palavras, \ B corresponde ao ponto entre \ W e \ W ou entre \ w e \ w, mas não entre \ W e \ w.
1
Esta resposta foi adicionada às Perguntas frequentes sobre expressões regulares de Stack Overflow , em "Âncoras".
aliteralmind de
1
@stephenhuh string.match()retorna apenas a primeira correspondência, a menos que você adicione o sinalizador globalg : "abc def".match(/\b./g)retorna['a', ' ', 'd']
Boêmio
1
Acho que essa é a melhor resposta. Eu também deveria ser aceito porque isso resolve a confusão. Muito mais para aprender aqui.
Wolf
38

Com um exemplo diferente:

Considere que esta é a string e o padrão a ser pesquisado é 'cat':

text = "catmania thiscat thiscatmaina";

Agora, definições,

'\ b' encontra / corresponde ao padrão no início ou no final de cada palavra.

'\ B' não encontra / corresponde ao padrão no início ou no final de cada palavra.

Casos Diferentes:

Caso 1: no início de cada palavra

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

Agora, o resultado é "ctmania thiscat thiscatmaina"

Caso 2: no final de cada palavra

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

Agora, o resultado é "catmania thisct thiscatmaina"

Caso 3: não no início

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

Agora, o resultado é "catmania thisct thisctmaina"

Caso 4: não no final

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

Agora, o resultado é "ctmania thiscat thisctmaina"

Caso 5: nem começo nem fim

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

Agora, o resultado é "catmania thiscat thisctmaina"

Espero que isto ajude :)

Agam
fonte
Corrija-me se eu estiver errado, por favor, mas, ao usar \ bcat \ b, se nossa string seria, por exemplo: "catcat é meu gato" => a primeira palavra (catcat) teria se aplicado a esta condição. não?.
Kosem
8

O metacaractere \ b é uma âncora como o circunflexo e o cifrão. Corresponde a uma posição chamada "limite de palavra". Esta correspondência tem comprimento zero.

Existem três posições diferentes que se qualificam como limites de palavras:

  • Antes do primeiro caractere da string, se o primeiro caractere for um caractere de palavra.
  • Após o último caractere da string, se o último caractere for um caractere de palavra.
  • Entre dois caracteres na string, onde um é um caractere de palavra e o outro não é um caractere de palavra.

\ B é a versão negada de \ b . \ B corresponde em todas as posições onde \ b não. Efetivamente, \ B corresponde em qualquer posição entre dois caracteres de palavra, bem como em qualquer posição entre dois caracteres de não palavra.

Fonte: http://www.regular-expressions.info/wordboundaries.html

Daniel Hilgarth
fonte
3

\bcorresponde a um limite de palavra. \Bcorresponde a não limites de palavras e é equivalente a (graças a @Alan Moore pela correção!) . Ambos têm largura zero.[^\b](?!\b)

Consulte http://www.regular-expressions.info/wordboundaries.html para obter detalhes. O site é extremamente útil para muitas questões básicas de regex.

Matt Ball
fonte
4
\Bnão é equivalente a [^\b]. Uma classe de caractere ( [...]ou [^...]) consome exatamente um caractere, enquanto asserções de largura zero gostam \be \Bnão consomem nada. Se você inserir \buma classe de caracteres, ela terá um significado completamente diferente: [\b]corresponde a um backspace e [^\b]corresponde a qualquer caractere, exceto um backspace. \Bé realmente equivalente a (?!\b).
Alan Moore
@Alan obrigado, você está completamente correto - eu não estava acordado esta manhã quando escrevi isso. Fixo.
Matt Ball
4
... mas por que alguém iria querer corresponder a um backspace está além de mim. : D
Alan Moore
1

Vamos pegar uma string como:

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

Nota: O sublinhado (_) não é considerado um caractere especial neste caso.

  1. /\bX\b/g Deve começar e terminar com um caractere especial ou espaço em branco

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 Deve começar com um caractere especial ou espaço em branco

X IX IXI X 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 Deve terminar com um caractere especial ou espaço em branco

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
    Não deve começar e não terminar com um caractere especial ou espaço em branco

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/gNão deve começar com um caractere especial ou espaço em branco

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/gNão deve terminar com um caractere especial ou espaço em branco

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/gDeve começar e não terminar com um caractere especial ou espaço em branco

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/gNão deve começar e deve terminar com um caractere especial ou espaço em branco

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

Kartik Patodi
fonte
1

Fonte © Copyright RexEgg.com

Limite de palavras: \ b *

O limite de palavra \ b corresponde a posições em que um lado é um caractere de palavra (geralmente uma letra, dígito ou sublinhado - mas veja abaixo as variações entre os motores) e o outro lado não é um caractere de palavra (por exemplo, pode ser o início de a string ou um caractere de espaço).

A regex \ bcat \ b corresponderia, portanto, a gato em um gato preto, mas não em catatônico, tomcat ou certificado. Removendo um dos limites, \ bcat corresponderia a gato em bagre e cat \ b corresponderia a gato em tomcat, mas não vice-versa. Ambos, é claro, combinariam com o gato por conta própria.

Limite de não uma palavra: \ B

\ B corresponde a todas as posições onde \ b não corresponde. Portanto, corresponde a:

✽ Quando nenhum lado é um caractere de palavra, por exemplo, em qualquer posição na string $ = (@ -% ++) (incluindo o início e o fim da string)

✽ Quando ambos os lados são um caractere de palavra, por exemplo, entre H e i em Hi!

Isso pode não parecer muito útil, mas às vezes \ B é exatamente o que você deseja. Por exemplo,

✽ \ Bcat \ B encontrará cat totalmente rodeado por caracteres de palavras, como no certificado, mas não sozinho nem no início ou no final das palavras.

✽ cat \ B encontrará gato tanto no certificado quanto no peixe-gato, mas não no gato nem sozinho.

✽ \ Bcat encontrará gato tanto no certificado quanto no tomcat, mas não no bagre nem sozinho.

✽ \ Bcat | cat \ B encontrará o gato em uma situação incorporada, por exemplo, no certificado, peixe-gato ou tomcat, mas não por conta própria.

Ganesh MS
fonte
1

\ b é usado como limite de palavra

word = "categorical cat"

Encontre todos os "gatos" na palavra acima

sem \ b

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

com B

re.findall(r'\bcat\b',word)
['cat']
Kavyajeet Bora
fonte
0

\Bse não \b , por exemplo, negativa \b

pass-keyaqui não há nenhum limite de palavra ao lado -então corresponde \Bao seu primeiro exemplo há limite de palavra ao lado de gato, então corresponde\b

regras semelhantes se aplicam a outros também. \Wé negativo de \w \UPPER CASEé negativo de\LOWER CASE

Neel Basu
fonte