Différence entre \ b et \ B dans regex


103

Je lis un livre sur l'expression régulière et je suis tombé sur cet exemple pour \b:

Le chat dispersa sa nourriture dans toute la pièce.

Utilisation de regex - \bcat\bcorrespondra au mot catmais pas au catin scattered.

Pour \Bl'auteur utilise l'exemple suivant:

Veuillez saisir l'identifiant à neuf chiffres tel qu'il

apparaît sur votre mot de passe codé par couleur.

Utilisation de \B-\Bcorrespondances regex -entre les mots color - coded. L'utilisation \b-\bd'autre part correspond aux -in nine-digitet pass-key.

Comment se fait-il dans le premier exemple que nous utilisons \bpour séparer catet dans le second \Bpour séparer -? Utiliser \bdans le deuxième exemple fait le contraire de ce qu'il a fait précédemment.

Veuillez m'expliquer la différence.

EDIT: Aussi, quelqu'un peut-il expliquer s'il vous plaît avec un nouvel exemple?

Réponses:


84

La confusion provient de votre réflexion sur les \bespaces (probablement parce que «b» suggère «vide»).

\bcorrespond à la chaîne vide au début ou à la fin d'un mot . \Bcorrespond à la chaîne vide qui ne se trouve ni au début ni à la fin d'un mot. La clé ici est que "-" ne fait pas partie d'un mot. Donc <left>-<right>correspond \b-\bparce qu'il y a des limites de mots de chaque côté du -. Par contre pour <left> - <right>(notez les espaces), il n'y a pas de limites de mot de chaque côté du tiret. Les limites du mot sont un espace plus à gauche et à droite.

D'un autre côté, lorsque vous recherchez des \bcat\blimites de mots, agissez de manière plus intuitive et correspond à "chat" comme prévu.


2
Oui, je confondais en effet \ b avec un espace vide. Cependant, je me sens encore un peu confus. Puis-je vous demander un autre exemple?
stirredo

3
La clé est que ce -n'est pas considéré comme faisant partie d'un mot. De même, !ne fait pas partie d'un mot. Donc à nouveau \b!\bcorrespond à "uunet! Iamold", mais pas à "Wow! You are". Vous pouvez essayer ce truc sur regexpal.com .
andrewdski

@andrewdski Dans mon cas \ b attrape aussi pour les ponctuations ... J'ai essayé avec \ b [A-Z0-9] + \ b sur 1987894, 3219800; 234567, 345261. et cela fonctionne bien, je n'obtiens que des chiffres
gunzapper

1
Il suffit d'ajouter qu'une œuvre en regex est composée de lettres (a– z et A– Z), de chiffres et du «_» [trait de soulignement]). Tout le reste n'est pas un mot.
Maralc

Quelqu'un pourrait-il élaborer cette ligne\B matches the empty string not at the beginning or end of a word
Arun Gowda

68

\best une limite de mot de largeur nulle. Plus précisément:

Correspond à la position entre un caractère de mot (tout ce qui correspond à \ w) et un caractère non-mot (tout ce qui correspond à [^ \ w] ou \ W) ainsi qu'au début et / ou à la fin de la chaîne si le premier et / ou les derniers caractères de la chaîne sont des caractères de mot.

Exemple: .\bcorrespond càabc

\Best une limite sans mot de largeur nulle. Plus précisément:

Correspond à la position entre deux caractères de mot (c.-à-d. La position entre \ w \ w) ainsi qu'à la position entre deux caractères non mot (c.-à-d. \ W \ W).

Exemple: \B.\Bcorrespond bàabc

Voir regular-expressions.info pour plus d'informations sur les regex


10
+1 car la largeur nulle est une partie importante de la définition. Si ce n'était pas de largeur nulle, alors il saisirait également ces caractères de mot / non-mot dans la partie correspondante du modèle.
Ben Hocking

5
En d'autres termes, \ B correspond à l'endroit entre \ W et \ W ou entre \ w et \ w, mais pas entre \ W et \ w.

1
Cette réponse a été ajoutée à la FAQ sur les expressions régulières Stack Overflow , sous "Anchors".
aliteralmind

1
@stephenhuh string.match()renvoie uniquement la première correspondance, sauf si vous ajoutez l' indicateur globalg : "abc def".match(/\b./g)renvoie['a', ' ', 'd']
Bohemian

1
Je pense que c'est la meilleure réponse. Je devrais aussi être accepté parce que cela résout la confusion. Beaucoup plus à apprendre ici.
Wolf le

38

Avec un autre exemple:

Considérez ceci est la chaîne et le modèle à rechercher est 'cat':

text = "catmania thiscat thiscatmaina";

Maintenant les définitions,

'\ b' trouve / correspond au modèle au début ou à la fin de chaque mot.

«\ B» ne trouve pas / ne correspond pas au motif au début ou à la fin de chaque mot.

Différents cas:

Cas 1: au début de chaque mot

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

Maintenant, le résultat est "ctmania thiscat thiscatmaina"

Cas 2: à la fin de chaque mot

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

Maintenant, le résultat est "catmania thisct thiscatmaina"

Cas 3: pas au début

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

Maintenant, le résultat est "catmania thisct thisctmaina"

Cas 4: pas à la fin

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

Maintenant, le résultat est "ctmania thiscat thisctmaina"

Cas 5: ni début ni fin

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

Maintenant, le résultat est "catmania thiscat thisctmaina"

J'espère que cela t'aides :)


Corrigez-moi si je me trompe s'il vous plaît, mais, lorsque vous utilisez \ bcat \ b, si notre chaîne aurait été, par exemple: "catcat is my cat" => le premier mot (catcat) aurait été appliqué à cette condition. non?.
Kosem

8

Le métacaractère \ b est une ancre comme le signe curseur et le signe dollar. Il correspond à une position appelée «limite de mot». Cette correspondance est de longueur nulle.

Il existe trois positions différentes qui peuvent être qualifiées de limites de mots:

  • Avant le premier caractère de la chaîne, si le premier caractère est un caractère de mot.
  • Après le dernier caractère de la chaîne, si le dernier caractère est un caractère de mot.
  • Entre deux caractères dans la chaîne, où l'un est un caractère de mot et l'autre n'est pas un caractère de mot.

\ B est la version annulée de \ b . \ B correspond à chaque position où \ b ne le fait pas. En effet, \ B correspond à n'importe quelle position entre deux caractères de mot ainsi qu'à n'importe quelle position entre deux caractères non mot.

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


3

\bcorrespond à une limite de mot. \Bcorrespond à des limites sans mots, et équivaut à (merci à @Alan Moore pour la correction!) . Les deux sont de largeur nulle.[^\b](?!\b)

Voir http://www.regular-expressions.info/wordboundaries.html pour plus de détails. Le site est extrêmement utile pour de nombreuses questions de base sur les regex.


4
\Bn'est pas équivalent à [^\b]. Une classe de caractères ( [...]ou [^...]) consomme exactement un caractère, tandis que les assertions de largeur nulle aiment \bet \Bne consomment rien. Si vous mettez \bdans une classe de caractères, cela prend une signification complètement différente: [\b]correspond à un retour arrière et [^\b]correspond à n'importe quel caractère sauf un retour arrière. \Best vraiment équivalent à (?!\b).
Alan Moore

@Alan merci, vous avez tout à fait raison - je n'étais pas réveillé ce matin quand j'ai écrit cela. Fixé.
Matt Ball

4
... mais pourquoi quelqu'un voudrait correspondre à un retour arrière me dépasse. : D
Alan Moore

1

Prenons une chaîne comme:

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

Remarque: le trait de soulignement (_) n'est pas considéré comme un caractère spécial dans ce cas.

  1. /\bX\b/g Doit commencer et se terminer par un caractère spécial ou un espace blanc

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 Doit commencer par un caractère spécial ou un espace blanc

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


  1. /X\b/g Doit se terminer par un caractère spécial ou un espace blanc

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
    Ne doit pas commencer et ne pas se terminer par un caractère spécial ou un espace blanc

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/gNe doit pas commencer par un caractère spécial ou un espace blanc

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/gNe devrait pas terminer par un caractère spécial ou un espace blanc

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/gDevrait commencer et non terminer par un caractère spécial ou un espace blanc

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 Devrait pas commencer et doit se terminer par un caractère spécial ou un espace blanc

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

Source © Copyright RexEgg.com

Limite de mot: \ b *

La limite de mot \ b correspond aux positions où un côté est un caractère de mot (généralement une lettre, un chiffre ou un trait de soulignement - mais voir ci-dessous pour les variations entre les moteurs) et l'autre côté n'est pas un caractère de mot (par exemple, il peut être le début de la chaîne ou un espace).

Le regex \ bcat \ b correspondrait donc à cat dans un chat noir, mais il ne correspondrait pas à catatonic, tomcat ou certificate. En supprimant l'une des limites, \ bcat correspondrait au chat dans le poisson-chat, et cat \ b correspondrait au chat dans le chat, mais pas l'inverse. Les deux, bien sûr, correspondraient au chat tout seul.

Limite de pas-un-mot: \ B

\ B correspond à toutes les positions où \ b ne correspond pas. Par conséquent, il correspond:

✽ Lorsqu'aucun côté n'est un caractère de mot, par exemple à n'importe quelle position dans la chaîne $ = (@ -% ++) (y compris le début et la fin de la chaîne)

✽ Lorsque les deux côtés sont un caractère de mot, par exemple entre le H et le i dans Hi!

Cela peut ne pas sembler très utile, mais parfois \ B est exactement ce que vous voulez. Par exemple,

✽ \ Bcat \ B trouvera chat entièrement entouré de caractères de mots, comme dans le certificat, mais ni seul, ni au début ou à la fin des mots.

✽ cat \ B trouvera chat à la fois dans le certificat et le poisson-chat, mais ni dans tomcat ni seul.

✽ \ Bcat trouvera chat à la fois dans le certificat et dans le chat, mais ni dans le poisson-chat ni seul.

✽ \ Bcat | cat \ B trouvera chat dans une situation embarquée, par exemple dans un certificat, un poisson-chat ou un chat, mais pas seul.


1

\ b est utilisé comme limite de mot

word = "categorical cat"

Trouvez tout "chat" dans le mot ci-dessus

sans \ b

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

avec B

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

0

\Bn'est pas \b par exemple négatif \b

pass-keyil n'y a pas de limite de mot à côté -donc cela correspond \Bdans votre premier exemple il y a une limite de mot à côté de chat donc ça correspond\b

des règles similaires s'appliquent également à d'autres. \West négatif de \w \UPPER CASEest négatif de\LOWER CASE

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.