Diferença entre \ b e \ B no regex

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

O gato espalhou sua comida por toda a sala.

Usar regex\bcat\b corresponderá à palavra cat mas não ao cat scattered .

Para \B o autor usa o seguinte exemplo:

Por favor, insira o id de nove dígitos

aparece na sua chave de access codificada por colors.

Utilizando correspondências regex \B-\B - entre a palavra color - coded . O uso de \b-\b por outro lado, corresponde ao - em nine-digit e pass-key .

Como é que no primeiro exemplo usamos \b para separar o cat e no segundo uso \B para separar - ? Usando \b no segundo exemplo faz o oposto do que fez anteriormente.

Por favor, explique a diferença para mim.

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

A confusão decorre do seu pensamento \b corresponde a espaços (provavelmente porque “b” sugere “em branco”).

\b combina a string vazia no começo ou no final de uma palavra . \B combina a string vazia não no início ou no final de uma palavra. A chave aqui é que “-” não faz parte de uma palavra. Então - corresponde a \b-\b porque existem limites de palavras em ambos os lados do - . Por outro lado, para - (observe os espaços), não há limites de palavras nos dois lados do traço. Os limites da palavra são um espaço à esquerda e à direita.

Por outro lado, quando pesquisar por limites de palavras \bcat\b comporta-se de forma mais intuitiva e corresponde a “cat” como esperado.

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

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

Exemplo:. .\b corresponde a c no abc

\B é um limite sem palavras de largura zero. Especificamente:

Corresponde à 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.\B corresponde a b no abc

Veja regular-expressions.info para mais informações sobre regex

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 / combina o padrão no início ou no final de cada palavra.

‘\ B’ não encontra / combina o 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 começo

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 🙂

O metacaractere \ b é uma âncora como o cursor e o cifrão. Ele corresponde a uma posição que é chamada de “limite de palavra”. Essa correspondência é de comprimento zero.

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

  • Antes do primeiro caractere na string, se o primeiro caractere for um caractere de palavra.
  • Após o último caractere na 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 a todas as posições em que \ b não. Efetivamente, \ B combina em qualquer posição entre dois caracteres de palavras, assim como em qualquer posição entre dois caracteres não-word.

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

\b corresponde a um limite de palavras. \B corresponde a limites sem palavras e é equivalente a [^\b] (?!\b) (graças a @Alan Moore pela correção!) . Ambos são de largura zero.

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

\B não é \b por exemplo, negativo \b

pass-key aqui não tem limite de palavra ao lado - então ele combina com \B no seu primeiro exemplo, há limite de palavra ao lado de cat para que ele seja igual a \b

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

Vamos pegar uma string como:

XIX IXI XX XI II XX 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 XXX XXXXXXXXXXXXX – X_X X


  1. /\bX/g deve começar com um caractere especial ou espaço em branco

XII XII X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X


  1. /X\b/g deve terminar com um caractere especial ou espaço em branco

XI XII X X X X II X X XXII X X X X X X X X X X X X XXX


  1. /\BX\B/g
    Não deve começar e não terminar com um caractere especial ou espaço em branco

XIX X X XX XII X X X X II X XX X X X X IX XX XIX IX X X X X X X X


  1. /\BX/g não deve começar com um caractere especial ou espaço em branco

XI X I X X X X II II X X X II X XX X X X X IX XX XIX X IX X X X X


  1. /X\B/g não deve terminar com um caractere especial ou espaço em branco

X X X X X X X II X X X X X X X II X X X X X X X X X X X IX X X X X X X X X X X X


  1. /\bX\B/g deve começar e não terminar com um caractere especial ou espaço em branco

X IX IX X X X II X X X XII X XX XX X X IX XX XIX X IX X X X X X X


  1. /\BX\b/g não deve começar e deve terminar com um caractere especial ou espaço em branco

XI XIII X X X II IIX X XXII II XX X X X X IX XX XIX XI X X X X X