Différence entre les méta caractères d'expression régulière \ w et \ b

142

Quelqu'un peut-il expliquer la différence entre \bet \wles métacaractères d'expression régulière? Je crois comprendre que ces deux métacaractères sont utilisés pour les limites de mots. En dehors de cela, quel méta caractère est efficace pour un contenu multilingue?

Mahender
la source
11
\wreprésente un caractère de mot , tandis que \breprésente une limite de mot entre un caractère de mot et un caractère non mot. Ce n'est pas la même chose.
BoltClock

Réponses:

259

Le métacaractère \best 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.

En termes simples: \bpermet d'effectuer une recherche "mots entiers uniquement" à l' aide d'une expression régulière sous la forme de \bword\b. Un «caractère de mot» est un caractère qui peut être utilisé pour former des mots. Tous les caractères qui ne sont pas des «caractères de mot» sont des «caractères de non-mot» .

Dans toutes les saveurs, les caractères [a-zA-Z0-9_]sont des caractères de mots. Ils correspondent également à la classe de caractères abrégés \w. Les saveurs affichant "ascii" pour les limites de mots dans la comparaison de saveurs ne reconnaissent que ces derniers comme caractères de mot.

\wsignifie «caractère de mot» , généralement [A-Za-z0-9_]. Notez l'inclusion du trait de soulignement et des chiffres.

\Best la version annulée de \b. \Bcorrespond à chaque position où \bpas. Effectivement, \Bcorrespond à n'importe quelle position entre deux caractères de mot ainsi qu'à n'importe quelle position entre deux caractères non mot.

\West l'abréviation de [^\w], la version annulée de \w.

Ωmega
la source
21

\wcorrespond à un caractère de mot. \best une correspondance de largeur nulle qui correspond à un caractère de position qui a un caractère de mot d'un côté, et quelque chose qui n'est pas un caractère de mot de l'autre. (Des exemples de choses qui ne sont pas des caractères de mots incluent les espaces, le début et la fin de la chaîne, etc.)

\wallumettes a, b, c, d, e, et fdans "abc def"
\bcorrespond à la position ( de longueur nulle) avant a, après c, avant d, et après fen"abc def"

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

jwismar
la source
3
Il est plus correct de dire que c'est la limite entre un caractère de mot et non un caractère de mot, car il correspond également entre un caractère de mot et le début ou la fin d'une chaîne si ce caractère est au début / à la fin de la chaîne.
MRAB
5
Ce n'est toujours pas tout à fait correct. \bune assertion de largeur nulle; il ne correspond pas à un caractère , il correspond à une position .
Alan Moore
10

@Mahender, vous vouliez probablement dire la différence entre \W(au lieu de \w) et \b. Sinon, je serais d'accord avec @BoltClock et @jwismar ci-dessus. Sinon, continuez à lire.

\Wcorrespondrait à n'importe quel caractère non-mot et il est donc facile d'essayer de l'utiliser pour faire correspondre les limites des mots. Le problème est qu'il ne correspondra pas au début ou à la fin d'une ligne. \best plus adapté pour faire correspondre les limites des mots car il correspondra également au début ou à la fin d'une ligne. En gros (les utilisateurs plus expérimentés peuvent me corriger ici) \bpeut être considéré comme (\W|^|$). [Modifier: comme @ Ωmega le mentionne ci-dessous, il \bs'agit d'une correspondance de longueur nulle, donc ce (\W|^|$)n'est pas strictement correct, mais nous espérons aider à expliquer la différence]

Exemple rapide: pour la chaîne Hello World, .+\Wcorrespondrait Hello_(avec l'espace) mais ne correspondrait pas World. .+\bcorrespondrait à la fois Helloet World.

mtariq
la source
Je ne suis pas d'accord sur le \bsens de la même chose que (\W|^|$), car (\W|^|$)inclura le caractère non-mot dans le résultat correspondant. Vous pouvez vérifier ce fait ici => regexr.com/3qf98 .
Victor le
\bpour moi, cela signifie la même chose que (?<=\W|^|$)lorsqu'il est utilisé avant un motif et (?=\W|^|$)lorsqu'il est utilisé après un motif. Vous pouvez vérifier de quoi je parle ici => regexr.com/3qf9h . Comparez simplement avec le résultat des \bancres ici => regexr.com/3qf9t
Victor
4
\b <= this is a word boundary.

Correspond à une position qui est suivie d'un caractère de mot mais non précédée d'un caractère de mot, ou qui est précédée d'un caractère de mot mais non suivie d'un caractère de mot.

\w <= stands for "word character". 

Il correspond toujours aux caractères ASCII [A-Za-z0-9_]

Essayez-vous de faire correspondre quelque chose de spécifique?

Quelques sites Web de regex utiles pour les débutants ou simplement pour vous mettre en appétit.

J'ai trouvé que c'était un livre très utile:

James Emanon
la source
5
C'est une bonne réponse, mais il est utile de se rappeler que ce \wn'est pas toujours équivalent aux caractères ASCII [A-Za-z0-9_]- il correspondra également aux points de code alphanumériques Unicode, et peut correspondre aux caractères ISO-Latin-1 8 bits si les paramètres régionaux sont définis correctement .
Tim Pierce
2

\west pas une limite de mot, il correspond à un caractère de mot, y compris underscores: [a-zA-Z0-9_]. \b est une limite de mot, c'est-à-dire qu'elle correspond à la position entre un mot et un caractère non alphanumérique: \Wou [^\w].

Ces implémentations peuvent cependant varier d'une langue à l'autre.

Julián Urbano
la source