2012-08-08 13 views
109

Kann jemand den Unterschied zwischen \ w und \ b regulären Ausdruck Meta-Zeichen erklären? Beide Metazeichen werden für Wortgrenzen verwendet. Abgesehen davon, welcher Meta-Charakter ist für mehrsprachige Inhalte effizient?Unterschied zwischen w und b regulären Ausdruck Meta-Zeichen

+11

'\ w' steht für ein Wort * Zeichen *, während' \ b' für ein Wort * Grenze zwischen * einem Wortzeichen und einem Nichtwortzeichen steht. Sie sind nicht das Gleiche. – BoltClock

Antwort

196

Der Metazeichen \b ist ein Anker wie das Caret und das Dollarzeichen. Es entspricht einer Position, die als "Wortgrenze" bezeichnet wird. Diese Übereinstimmung ist Nulllänge.

Es gibt drei verschiedene Positionen, die als Wortgrenzen in Frage kommen:

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

Einfach gesagt: \b Sie erlaubt eine „nur ganze Wörter“ auszuführen Suche einen regulären Ausdruck in Form von \bword\b verwenden.A "Wort Zeichen" ist ein Zeichen, das verwendet werden kann, um Wörter zu bilden. Alle Zeichen, die nicht "Wortzeichen" sind, sind "non-word Zeichen". Die Zeichen [a-zA-Z0-9_] sind in allen Varianten die Wortzeichen. Diese werden auch von der Kurzzeichen-Zeichenklasse \w abgeglichen. Flavors, die "ascii" für Wortgrenzen im Geschmackvergleich zeigen, erkennen nur diese als Wortzeichen.

\w steht für "Wort Zeichen", normalerweise [A-Za-z0-9_]. Beachten Sie die Aufnahme von Unterstrich und Ziffern.

\B ist die negierte Version von \b. \B passt an jeder Position, wo \b nicht funktioniert. Effektiv passt \B an jeder Position zwischen zwei Wortzeichen sowie an jeder Position zwischen zwei Nicht-Wortzeichen.

\W ist die Abkürzung für [^\w], die negierte Version von \w.

19

\w passt ein Wortzeichen. \b ist eine Null-Breite-Übereinstimmung, die einem Positionszeichen entspricht, das auf der einen Seite ein Wortzeichen und auf der anderen Seite kein Wortzeichen hat. (Beispiele für Dinge, die nicht Wortzeichen sind enthalten Leerzeichen, Anfang und Ende des Strings, etc.)

\w Streichhölzer a, b, c, d, e und f in "abc def"
\b entspricht der (Null -breite) Position vor a nach c, vor d und nach f in "abc def"

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

+3

Es ist korrekter zu sagen, dass es die Grenze zwischen einem Wortzeichen und nicht einem Wortzeichen ist, da es auch zwischen einem Wortzeichen und dem Anfang oder Ende eines Strings passt, wenn sich dieses Zeichen am Anfang/Ende des Strings befindet. – MRAB

+0

Sie haben Recht, das ist richtiger. Ich werde bearbeiten. – jwismar

+5

Es ist immer noch nicht ganz richtig. '\ b 'eine Assertion mit der Breite null; Es entspricht keinem * Zeichen *, es entspricht einer * Position *. –

6

@Mahender, meinst du wahrscheinlich den Unterschied zwischen \W (statt \w) und \b. Wenn nicht, dann stimme ich @BoltClock und @jwismar oben zu. Ansonsten weiterlesen.

\W würde jedes Nicht-Wort-Zeichen entsprechen und so ist es einfach zu versuchen, es zu verwenden, um Wortgrenzen zu entsprechen. Das Problem ist, dass es nicht mit dem Anfang oder Ende einer Zeile übereinstimmt. \b eignet sich besser für Wortgrenzen, da es auch den Anfang oder das Ende einer Zeile abgleicht. Grob gesagt (mehr erfahrene Benutzer können mich hier korrigieren) \b kann als (\W|^|$) gedacht werden. [Edit: wie @ Ωmega unten erwähnt, ist \b eine Länge Null Spiel so (\W|^|$) nicht ganz korrekt ist, aber hoffentlich hilft das Diff erklären]

Schnell Beispiel: Für die Zeichenfolge Hello World würde .+\WHello_ übereinstimmen (mit dem Raum) wird aber nicht übereinstimmen World. .+\b würde sowohl Hello als auch World entsprechen.

1

\wnicht eine Wortgrenze ist, entspricht es ein beliebiges Wortzeichen, einschließlich Unterstrichen: [a-zA-Z0-9_]. \bist eine Wortgrenze, das heißt, es entspricht der Position zwischen einem Wort und einem nicht-alphanumerischen Zeichen: \W oder [^\w].

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

4
\b <= this is a word boundary. 

Spiele an einer Position, die von einem Wortzeichen gefolgt wird, aber nicht durch ein Wortzeichen voraus, oder daß von einem Wortzeichen vorangeht, aber nicht durch ein Wort Zeichen folgen.

\w <= stands for "word character". 

Es passt immer die ASCII-Zeichen [A-Za-z0-9_]

Gibt es etwas Bestimmtes Sie passen wollen?

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

fand ich das ein sehr nützliches Buch sein:

+5

Dies ist eine gute Antwort, aber es ist nützlich, daran zu denken, dass '\ w' nicht immer äquivalent zu den ASCII-Zeichen' [A-Za-z0-9_] 'ist - es wird auch alphanumerischen Unicode-Codepunkten entsprechen und kann Passen Sie 8-Bit-ISO-Latin-1-Zeichen an, wenn das Gebietsschema entsprechend festgelegt ist. –

Verwandte Themen