Differenza tra \ be \ B in regex


103

Sto leggendo un libro sulle espressioni regolari e mi sono imbattuto in questo esempio per \b:

Il gatto ha sparso il suo cibo per tutta la stanza.

Utilizzando regex: \bcat\bcorrisponderà alla parola catma non catall'in scattered.

Per \Bl'autore utilizza il seguente esempio:

Inserisci l'ID a nove cifre così com'è

appare sulla tua chiave di accesso codificata a colori.

Utilizzo di \B-\Bcorrispondenze regex -tra le parole color - coded. L'utilizzo \b-\bd'altra parte corrisponde a -in nine-digite pass-key.

Come mai nel primo esempio usiamo \bper separare cate nel secondo \Bper separare -? L'uso \bnel secondo esempio fa l'opposto di quello che ha fatto in precedenza.

Per favore, spiegami la differenza.

EDIT: Inoltre, qualcuno può spiegare con un nuovo esempio?

Risposte:


84

La confusione deriva dal fatto che il tuo modo di pensare \bcorrisponde agli spazi (probabilmente perché "b" suggerisce "vuoto").

\bcorrisponde alla stringa vuota all'inizio o alla fine di una parola . \Bcorrisponde alla stringa vuota non all'inizio o alla fine di una parola. La chiave qui è che "-" non fa parte di una parola. Quindi <left>-<right>corrisponde \b-\bperché ci sono confini di parola su entrambi i lati del file -. D'altra parte per <left> - <right>(nota gli spazi), non ci sono confini di parola su entrambi i lati del trattino. I confini delle parole sono uno spazio più a sinistra e a destra.

D'altra parte, quando si cercano i \bcat\bconfini delle parole si comportano in modo più intuitivo e corrispondono a "gatto" come previsto.


2
Sì, stavo davvero confondendo \ b con uno spazio vuoto. Tuttavia, mi sento ancora un po 'confuso. Posso chiederti un altro esempio?
stirredo

3
La chiave è che -non è considerato parte di una parola. Allo stesso modo, !non fa parte di una parola. Quindi \b!\bcorrisponde di nuovo a "uunet! Iamold", ma non a "Wow! Lo sei". Puoi provare questa roba su regexpal.com .
andrewdski

@andrewdski Nel mio caso \ b cattura anche la punteggiatura ... Ho provato con \ b [A-Z0-9] + \ b su 1987894, 3219800; 234567, 345261. e funziona bene, ottengo solo numeri
gunzapper

1
Aggiungendo solo che un'opera in regex è composta da lettere (a– ze A– Z), cifre e "_" [trattino basso]). Tutto il resto non è parola.
Maralc

Qualcuno potrebbe elaborare questa linea\B matches the empty string not at the beginning or end of a word
Arun Gowda,

68

\bè un confine di parola di larghezza zero. Nello specifico:

Corrisponde alla posizione tra un carattere di parola (qualsiasi cosa corrisponde a \ w) e un carattere non parola (qualsiasi cosa corrisponde a [^ \ w] o \ W) così come all'inizio e / o alla fine della stringa se la prima e / o gli ultimi caratteri della stringa sono caratteri alfanumerici.

Esempio: .\bpartite cinabc

\Bè un confine non di parola di larghezza zero. Nello specifico:

Corrisponde alla posizione tra due caratteri alfanumerici (ovvero la posizione tra \ w \ w) e alla posizione tra due caratteri non alfanumerici (es. \ W \ W).

Esempio: \B.\Bpartite binabc

Vedi regular-expressions.info per maggiori informazioni sulle espressioni regolari


10
+1 perché la larghezza zero è una parte importante della definizione. Se non fosse di larghezza zero, catturerebbe anche quei caratteri parola / non parola nella parte corrispondente del modello.
Ben Hocking

5
In altre parole, \ B trova il punto tra \ W e \ W o tra \ w e \ w, ma non tra \ W e \ w.

1
Questa risposta è stata aggiunta alle domande frequenti sulle espressioni regolari di Stack Overflow , in "Ancoraggi".
aliteralmind

1
@stephenhuh string.match()restituisce solo la prima corrispondenza, a meno che tu non aggiunga la bandiera globaleg : "abc def".match(/\b./g)ritorna['a', ' ', 'd']
Bohémien

1
Penso che questa sia la risposta migliore. Dovrei essere anche io quello accettato perché risolve la confusione. Molto altro da imparare qui.
Lupo

38

Con un esempio diverso:

Considera che questa è la stringa e il modello da cercare è 'cat':

text = "catmania thiscat thiscatmaina";

Ora definizioni,

"\ b" trova / corrisponde al modello all'inizio o alla fine di ogni parola.

"\ B" non trova / corrisponde al modello all'inizio o alla fine di ogni parola.

Casi diversi:

Caso 1: all'inizio di ogni parola

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

Ora, il risultato è "ctmania thiscat thiscatmaina"

Caso 2: alla fine di ogni parola

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

Ora, il risultato è "catmania thisct thiscatmaina"

Caso 3: non all'inizio

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

Ora, il risultato è "catmania thisct thisctmaina"

Caso 4: non alla fine

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

Ora, il risultato è "ctmania thiscat thisctmaina"

Caso 5: né inizio né fine

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

Ora, il risultato è "catmania thiscat thisctmaina"

Spero che questo ti aiuti :)


Correggimi se sbaglio, per favore, ma, quando usi \ bcat \ b, se la nostra stringa fosse stata, ad esempio: "catcat is my cat" => la prima parola (catcat) si sarebbe applicata a questa condizione. no?.
Kosem

8

Il metacarattere \ b è un'ancora come il cursore e il segno del dollaro. Corrisponde a una posizione chiamata "confine di parola". Questa corrispondenza è di lunghezza zero.

Ci sono tre diverse posizioni che si qualificano come confini di parole:

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

\ B è la versione negata di \ b . \ B corrisponde in ogni posizione dove \ b non lo fa. In effetti, \ B trova in qualsiasi posizione tra due caratteri alfanumerici nonché in qualsiasi posizione tra due caratteri non alfanumerici.

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


3

\bcorrisponde a un confine di parola. \Bcorrisponde ai confini non di parola ed è equivalente a (grazie a @Alan Moore per la correzione!) . Entrambi sono di larghezza zero.[^\b](?!\b)

Vedi http://www.regular-expressions.info/wordboundaries.html per i dettagli. Il sito è estremamente utile per molte domande regolari di base.


4
\Bnon è equivalente a [^\b]. Una classe di caratteri ( [...]o [^...]) consuma esattamente un carattere, mentre le asserzioni di larghezza zero come \be\B non consumano nulla. Se inserisci \buna classe di caratteri, assume un significato completamente diverso: [\b]corrisponde a un backspace e [^\b]corrisponde a qualsiasi carattere tranne un backspace. \Bè davvero equivalente a (?!\b).
Alan Moore

@Alan, grazie, hai completamente ragione - non ero sveglio stamattina quando l'ho scritto. Fisso.
Matt Ball

4
... ma perché qualcuno vorrebbe abbinare un backspace è al di là di me. : D
Alan Moore

1

Prendiamo una stringa come:

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

Nota: il trattino basso (_) non è considerato un carattere speciale in questo caso.

  1. /\bX\b/g Dovrebbe iniziare e finire con un carattere speciale o uno spazio bianco

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 Dovrebbe iniziare con un carattere speciale o uno spazio bianco

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 IX - X -I- X _X _X-


  1. /X\b/g Dovrebbe terminare con un carattere speciale o uno spazio bianco

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
    Non deve iniziare e non terminare con un carattere speciale o uno spazio bianco

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/gNon deve iniziare con un carattere speciale o uno spazio bianco

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/gNon deve terminare con un carattere speciale o uno spazio bianco

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/gDovrebbe iniziare e non terminare con un carattere speciale o uno spazio bianco

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/g Dovrebbero Non iniziare e dovrebbe terminare con un carattere speciale o uno spazio bianco

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


1

fonte © Copyright RexEgg.com

Confine parola: \ b *

Il confine di parola \ b corrisponde alle posizioni in cui un lato è un carattere di parola (di solito una lettera, una cifra o un trattino basso, ma vedi sotto per le variazioni tra i motori) e l'altro lato non è un carattere di parola (ad esempio, potrebbe essere l'inizio di la stringa o uno spazio).

L'espressione regolare \ bcat \ b, quindi, corrisponderebbe a gatto in un gatto nero, ma non lo corrisponderebbe in catatonico, gatto o certificato. Rimuovendo uno dei confini, \ bcat corrisponderebbe a cat in catfish e cat \ b a cat in tomcat, ma non viceversa. Entrambi, ovviamente, si abbinerebbero al gatto da soli.

Non-una-parola-confine: \ B

\ B corrisponde a tutte le posizioni in cui \ b non corrisponde. Pertanto, corrisponde a:

✽ Quando nessuno dei lati è un carattere di parola, ad esempio in qualsiasi posizione nella stringa $ = (@ -% ++) (inclusi l'inizio e la fine della stringa)

✽ Quando entrambi i lati sono un carattere di parola, ad esempio tra la H e la i in Hi!

Potrebbe non sembrare molto utile, ma a volte \ B è proprio quello che vuoi. Per esempio,

✽ \ Bcat \ B troverà gatto completamente circondato da caratteri alfanumerici, come nel certificato, ma né da solo né all'inizio o alla fine delle parole.

✽ cat \ B troverà gatto sia in certificate che in catfish, ma né in tomcat né da solo.

✽ \ Bcat troverà cat sia in certificate che in tomcat, ma né in catfish né da solo.

✽ \ Bcat | cat \ B troverà cat nella situazione incorporata, ad esempio in certificate, catfish o tomcat, ma non da solo.


1

\ b è usato come confine di parola

word = "categorical cat"

Trova tutto "gatto" nella parola sopra

senza \ b

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

con \ b

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

0

\Bnon è ad\b esempio negativo \b

pass-keyqui non c'è alcun confine di parola accanto -quindi corrisponde \Bnel tuo primo esempio ci sono confini di parola accanto a gatto quindi corrisponde\b

regole simili valgono anche per gli altri. \Wè negativo di \w \UPPER CASEè negativo di\LOWER CASE

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.