Differenza tra i meta caratteri di espressione regolare \ w e \ b


142

Qualcuno può spiegare la differenza tra \bed \wi metacaratteri delle espressioni regolari? Comprendo che entrambi questi metacaratteri sono utilizzati per i confini delle parole. A parte questo, quale meta personaggio è efficiente per i contenuti multilingue?


11
\wrappresenta un carattere parola , mentre \brappresenta un confine tra una parola carattere e una non parola. Non sono la stessa cosa.
BoltClock

Risposte:


259

Il metacarattere \bè un'ancora come il cursore e il simbolo del dollaro. Corrisponde a una posizione che si chiama "limite di parola" . Questa partita ha lunghezza zero.

Esistono tre diverse posizioni che si qualificano come limiti di parole:

  • Prima del primo carattere nella stringa, se il primo carattere è una parola.
  • Dopo l'ultimo carattere nella stringa, se l'ultimo carattere è una parola.
  • Tra due caratteri nella stringa, dove uno è un carattere di parola e l'altro non è un carattere di parola.

In poche parole: \bconsente di eseguire una ricerca "solo parole intere" utilizzando un'espressione regolare sotto forma di \bword\b. Un "carattere parola" è un carattere che può essere utilizzato per formare parole. Tutti i caratteri che non sono "caratteri di parole" sono "caratteri non di parole" .

In tutti i sensi, i personaggi [a-zA-Z0-9_]sono caratteri di parole. Questi sono anche abbinati alla classe di caratteri a mano corta \w. I sapori che mostrano "ascii" per i confini delle parole nel confronto dei sapori riconoscono solo questi come caratteri di parole.

\wsta per "carattere parola" , di solito [A-Za-z0-9_]. Si noti l'inclusione del carattere di sottolineatura e delle cifre.

\Bè la versione negata di \b. \Bcorrisponde in ogni posizione dove \bnon lo fa. Effettivamente, \Bcorrisponde in qualsiasi posizione tra due caratteri di parole e in qualsiasi posizione tra due caratteri non di parole.

\Wè l'abbreviazione di [^\w], la versione negata di \w.


21

\wcorrisponde a un carattere di parola. \bè una corrispondenza di larghezza zero che corrisponde a un carattere di posizione che ha un carattere di parola su un lato e qualcosa che non è un carattere di parola sull'altro. (Esempi di cose che non sono caratteri di parole includono spazi bianchi, inizio e fine della stringa, ecc.)

\wpartite a, b, c, d, e, e fin "abc def"
\bpartite posizione (larghezza zero) prima a, dopo c, prima de dopo fin"abc def"

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


3
È più corretto dire che è il confine tra un carattere di parola e non un carattere di parola perché corrisponde anche tra un carattere di parola e l'inizio o la fine di una stringa se quel carattere è all'inizio / alla fine della stringa.
MRAB

5
Non è ancora del tutto giusto. \bun'asserzione di larghezza zero; non corrisponde a un personaggio , corrisponde a una posizione .
Alan Moore,

10

@Mahender, probabilmente intendevi la differenza tra \W(anziché \w) e \b. In caso contrario, sarei d'accordo con @BoltClock e @jwismar sopra. Altrimenti continua a leggere.

\Wcorrisponderebbe a qualsiasi carattere non verbale ed è quindi facile provare a usarlo per abbinare i confini delle parole. Il problema è che non corrisponderà all'inizio o alla fine di una riga. \bè più adatto per abbinare i confini delle parole in quanto corrisponderà anche all'inizio o alla fine di una riga. In parole povere (gli utenti più esperti possono correggermi qui) si \bpuò pensare come (\W|^|$). [Modifica: come @ Ωmega menziona di seguito, \bè una corrispondenza di lunghezza zero quindi (\W|^|$)non è strettamente corretta, ma si spera che aiuti a spiegare il diff]

Esempio rapido: per la stringa Hello World, .+\Wcorrisponderebbe Hello_(con lo spazio) ma non corrisponderà World. .+\bcorrisponderebbe a entrambi Helloe World.


Non sono d'accordo nel \bsignificato come (\W|^|$), poiché (\W|^|$)includerà il carattere non verbale all'interno del risultato della corrispondenza. Puoi verificare questo fatto qui => regexr.com/3qf98 .
Victor,

\bper me, significa lo stesso di (?<=\W|^|$)quando usato prima di un motivo e (?=\W|^|$)quando usato dopo un motivo. Puoi controllare di cosa sto parlando qui => regexr.com/3qf9h . Basta confrontare con il risultato delle \bancore proprio qui => regexr.com/3qf9t
Victor

4
\b <= this is a word boundary.

Corrisponde a una posizione seguita da un carattere di parola ma non preceduto da un carattere di parola o che è preceduto da un carattere di parola ma non seguito da un carattere di parola.

\w <= stands for "word character". 

Corrisponde sempre ai caratteri ASCII [A-Za-z0-9_]

C'è qualcosa di specifico che stai cercando di abbinare?

Alcuni utili siti web regex per principianti o semplicemente per inumidire l'appetito.

Ho trovato questo un libro molto utile:


5
Questa è una buona risposta, ma è utile ricordare che \wnon è sempre equivalente ai caratteri ASCII [A-Za-z0-9_]: corrisponderà anche a punti di codice Unicode alfanumerici e potrebbe corrispondere a caratteri ISO-Latin-1 a 8 bit se l'impostazione internazionale è impostata in modo appropriato .
Tim Pierce,

2

\wè non è un confine di parola, corrisponde a qualsiasi carattere di parola, tra cui sottolineature: [a-zA-Z0-9_]. \b è un limite di parole, ovvero corrisponde alla posizione tra una parola e un carattere non alfanumerico: \Wo [^\w].

Queste implementazioni possono tuttavia variare da lingua a lingua.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.