Diferença entre meta caracteres de expressão regular \ w e \ b

142

Alguém pode explicar a diferença entre \be \wmetacaracteres de expressão regular? Entendo que esses dois metacaracteres são usados ​​para limites de palavras. Além disso, qual meta caractere é eficiente para conteúdo multilíngue?

Mahender
fonte
11
\wrepresenta um caractere de palavra , enquanto \brepresenta um limite de palavra entre um caractere de palavra e um caractere que não é uma palavra. Eles não são a mesma coisa.
BoltClock

Respostas:

259

O metacaractere \bé uma âncora como o sinal de intercalação e o cifrão. Corresponde em uma posição chamada "limite de palavras" . Esta partida é de comprimento zero.

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

  • Antes do primeiro caractere na sequência, se o primeiro caractere for um caractere de palavra.
  • Após o último caractere na sequência, se o último caractere for um caractere de palavra.
  • Entre dois caracteres na sequência, em que um é um caractere de palavra e o outro não é um caractere de palavra.

Simplificando: \bpermite realizar uma pesquisa "apenas palavras inteiras" usando uma expressão regular na forma de \bword\b. Um "caractere de palavra" é um caractere que pode ser usado para formar palavras. Todos os caracteres que não são "caracteres de palavras" são " caracteres que não são de palavras" .

Em todos os sabores, os caracteres [a-zA-Z0-9_]são caracteres de palavras. Eles também são correspondidos pela classe de caracteres de mão curta \w. Os sabores que mostram "ascii" para os limites de palavras na comparação de sabores reconhecem apenas esses caracteres como caracteres de palavra.

\wsignifica "caractere de palavra" , geralmente [A-Za-z0-9_]. Observe a inclusão do sublinhado e dos dígitos.

\Bé a versão negada de \b. \Bcombina em todas as posições em \bque não. Efetivamente, \Bcorresponde a qualquer posição entre dois caracteres de palavra e em qualquer posição entre dois caracteres que não sejam de palavra.

\Wé a abreviação de [^\w], a versão negada de \w.

Ωmega
fonte
21

\wcorresponde a um caractere de palavra. \bé uma correspondência de largura zero que corresponde a um caractere de posição que possui um caractere de palavra de um lado e algo que não é um caractere de palavra do outro lado. (Exemplos de coisas que não são caracteres de palavras incluem espaço em branco, início e fim da string etc.)

\wpartidas a, b, c, d, e, e fem "abc def"
\bjogos a (de largura zero) posição antes de a, após c, antes d, e depois fem"abc def"

Veja: http://www.regular-expressions.info/reference.html/

jwismar
fonte
3
É mais correto dizer que é o limite entre um caractere de palavra e não um caractere de palavra porque também corresponde entre um caractere de palavra e o início ou o fim de uma sequência, se esse caractere estiver no início / final da sequência.
MRAB 8/08
5
Ainda não está bem. \buma afirmação de largura zero; não corresponde a um personagem , corresponde a uma posição .
Alan Moore
10

@ Mahender, você provavelmente quis dizer a diferença entre \W(em vez de \w) e \b. Caso contrário, eu concordo com @BoltClock e @jwismar acima. Caso contrário, continue lendo.

\Wcorresponderia a qualquer caractere que não seja palavra e, portanto, é fácil tentar usá-lo para corresponder aos limites das palavras. O problema é que ele não corresponderá ao início ou ao final de uma linha. \bé mais adequado para corresponder aos limites das palavras, pois também corresponderá ao início ou ao final de uma linha. Grosso modo (usuários mais experientes podem me corrigir aqui) \bpode ser considerado como (\W|^|$). [Editar: como @ Ωmega menciona abaixo, \bé uma correspondência de comprimento zero, portanto (\W|^|$)não é estritamente correta, mas espero que ajude a explicar a diferença]

Exemplo rápido: para a sequência Hello World, .+\Wcorresponderia Hello_(com o espaço), mas não corresponderá World. .+\bcorresponderia a ambos Helloe World.

mtariq
fonte
Não concordo em \bsignificar o mesmo que (\W|^|$), pois (\W|^|$)incluirá o caractere que não é palavra dentro do resultado correspondente. Você pode verificar esse fato aqui => regexr.com/3qf98 .
Victor
\bpara mim, significa o mesmo que (?<=\W|^|$)quando usado antes de um padrão e (?=\W|^|$)quando usado depois de um padrão. Você pode conferir o que estou falando aqui => regexr.com/3qf9h . Basta comparar com o resultado das \bâncoras aqui => regexr.com/3qf9t
Victor
4
\b <= this is a word boundary.

Corresponde a uma posição que é seguida por um caractere de palavra, mas não precedida por um caractere de palavra, ou que é precedida por um caractere de palavra, mas não é seguida por um caractere de palavra.

\w <= stands for "word character". 

Sempre corresponde aos caracteres ASCII [A-Za-z0-9_]

Existe algo específico que você está tentando corresponder?

Alguns sites úteis sobre regex para iniciantes ou apenas para diminuir o apetite.

Achei este livro muito útil:

James Emanon
fonte
5
Essa é uma boa resposta, mas é útil lembrar que \wnem sempre é equivalente aos caracteres ASCII [A-Za-z0-9_]- ele também corresponderá aos pontos de código alfanuméricos Unicode e poderá corresponder aos caracteres ISO-Latin-1 de 8 bits se o código do idioma estiver definido adequadamente .
Tim Pierce
2

\wé não um limite de palavra, ele corresponde a qualquer caractere de palavra, incluindo sublinhados: [a-zA-Z0-9_]. \b é um limite de palavras, ou seja, corresponde à posição entre uma palavra e um caractere não alfanumérico: \Wou [^\w].

Essas implementações podem variar de idioma para idioma.

Julián Urbano
fonte