Unterschied zwischen Metazeichen für reguläre Ausdrücke \ w und \ b

142

Kann jemand den Unterschied zwischen \bund erklären\w Metazeichen regulären Zeichen ? Nach meinem Verständnis werden diese beiden Metazeichen für Wortgrenzen verwendet. Abgesehen davon, welcher Meta-Charakter ist für mehrsprachige Inhalte effizient?

Mahender
quelle
11
\wrepräsentiert ein Wort Charakter , während \bein Wort darstellt Grenze zwischen einem Wortzeichen und einem Nicht-Wortzeichen. Sie sind nicht dasselbe.
BoltClock

Antworten:

259

Das Metazeichen \bist ein Anker wie das Caret und das Dollarzeichen. Es stimmt an einer Position überein, die als "Wortgrenze" bezeichnet wird . Diese Übereinstimmung hat eine Länge von Null.

Es gibt drei verschiedene Positionen, die als Wortgrenzen gelten:

  • Vor dem ersten Zeichen in der Zeichenfolge, wenn das erste Zeichen ein Wortzeichen ist.
  • Nach dem letzten Zeichen in der Zeichenfolge, wenn das letzte Zeichen ein Wortzeichen ist.
  • Zwischen zwei Zeichen in der Zeichenfolge, wobei eines ein Wortzeichen und das andere kein Wortzeichen ist.

Einfach ausgedrückt: \bErmöglicht die Suche nach "nur ganzen Wörtern" mit einem regulären Ausdruck in Form von \bword\b. Ein "Wortzeichen" ist ein Zeichen, das zur Bildung von Wörtern verwendet werden kann. Alle Zeichen, die keine "Wortzeichen" sind, sind "Nichtwortzeichen". .

In allen Geschmacksrichtungen sind die Zeichen [a-zA-Z0-9_]Wortzeichen. Diese werden auch von der Kurzzeichenklasse abgeglichen \w. Aromen mit "ascii" im Geschmacksvergleich für Wortgrenzen erkennen nur diese als Wortzeichen.

\wsteht normalerweise für "Wortzeichen"[A-Za-z0-9_] . Beachten Sie die Aufnahme des Unterstrichs und der Ziffern.

\Bist die negierte Version von \b. \Bpasst an jeder Position, wo \bnicht. Stimmt effektiv \Ban einer beliebigen Position zwischen zwei Wortzeichen sowie an einer beliebigen Position zwischen zwei Nichtwortzeichen überein.

\Wist [^\w]die Abkürzung für die negierte Version von \w.

Ωmega
quelle
21

\wentspricht einem Wortzeichen. \bist eine Übereinstimmung mit der Breite Null, die einem Positionszeichen entspricht, das auf der einen Seite ein Wortzeichen und auf der anderen Seite kein Wortzeichen enthält. (Beispiele für Dinge, die keine Wortzeichen sind, sind Leerzeichen, Anfang und Ende der Zeichenfolge usw.)

\wSpielen a, b, c, d, e, und fin "abc def"
\bSpielen die (Null-Breite) Position vor a, nach c, vor dund nach dem fin"abc def"

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

jwismar
quelle
3
Es ist richtiger zu sagen, dass es die Grenze zwischen einem Wortzeichen und keinem Wortzeichen ist, da es auch zwischen einem Wortzeichen und dem Anfang oder Ende einer Zeichenfolge übereinstimmt, wenn sich dieses Zeichen am Anfang / Ende der Zeichenfolge befindet.
MRAB
5
Es ist immer noch nicht ganz richtig. \beine Behauptung mit einer Breite von Null; es passt nicht zu einem Charakter , es passt zu einer Position .
Alan Moore
10

@ Mahender, du hast wahrscheinlich den Unterschied zwischen \W(statt \w) und gemeint \b. Wenn nicht, würde ich @BoltClock und @jwismar oben zustimmen. Ansonsten lesen Sie weiter.

\Wwürde mit jedem Nicht-Wort-Zeichen übereinstimmen und daher ist es einfach zu versuchen, es zum Abgleichen von Wortgrenzen zu verwenden. Das Problem ist, dass es nicht mit dem Anfang oder Ende einer Zeile übereinstimmt. \bist besser geeignet, um Wortgrenzen abzugleichen, da es auch mit dem Anfang oder Ende einer Zeile übereinstimmt. Grob gesagt (erfahrene Benutzer können mich hier korrigieren) \bkann man sich vorstellen (\W|^|$). [Bearbeiten: Wie @ Ωmega unten erwähnt, \bist dies also eine Übereinstimmung mit der Länge Null(\W|^|$) nicht streng korrekt, hilft aber hoffentlich, den Unterschied zu erklären.]

Schnell Beispiel: Für die Zeichenfolge Hello World, .+\Wwürde übereinstimmen Hello_(mit Leerzeichen) , aber nicht übereinstimmt World. .+\bwürde zu beiden passen Hellound World.

mtariq
quelle
Ich bin nicht einverstanden mit \bder gleichen Bedeutung wie (\W|^|$), da (\W|^|$)das Nicht-Wort-Zeichen in das übereinstimmende Ergebnis aufgenommen wird. Sie können diese Tatsache hier überprüfen => regexr.com/3qf98 .
Victor
\bbedeutet für mich dasselbe wie (?<=\W|^|$)vor einem Muster und (?=\W|^|$)nach einem Muster. Sie können überprüfen, wovon ich hier spreche => regexr.com/3qf9h . Vergleichen Sie einfach hier mit dem Ergebnis der \bAnker => regexr.com/3qf9t
Victor
4
\b <= this is a word boundary.

Stimmt mit einer Position überein, auf die ein Wortzeichen folgt, der jedoch kein Wortzeichen vorangestellt ist, oder der ein Wortzeichen vorangestellt ist, dem jedoch kein Wortzeichen folgt.

\w <= stands for "word character". 

Es stimmt immer mit den ASCII-Zeichen überein [A-Za-z0-9_]

Gibt es etwas Spezielles, mit dem Sie übereinstimmen möchten?

Einige nützliche Regex-Websites für Anfänger oder um Ihren Appetit zu stillen.

Ich fand das ein sehr nützliches Buch:

James Emanon
quelle
5
Dies ist eine gute Antwort, aber es ist nützlich, sich daran zu erinnern, dass dies \wnicht immer den ASCII-Zeichen entspricht. [A-Za-z0-9_]Es stimmt auch mit alphanumerischen Unicode-Codepunkten überein und kann mit 8-Bit-ISO-Latin-1-Zeichen übereinstimmen, wenn das Gebietsschema entsprechend festgelegt ist .
Tim Pierce
2

\wist keine Wortgrenze, sondern entspricht jedem Wortzeichen, einschließlich Unterstrichen : [a-zA-Z0-9_]. \b ist eine Wortgrenze, dh sie entspricht der Position zwischen einem Wort und einem nicht alphanumerischen Zeichen: \Woder[^\w] .

Diese Implementierungen können jedoch von Sprache zu Sprache variieren.

Julián Urbano
quelle