Unterschied zwischen \ b und \ B in Regex

103

Ich lese ein Buch über regulären Ausdruck und bin auf dieses Beispiel gestoßen für \b:

Die Katze verteilte sein Futter im ganzen Raum.

Regex verwenden - entspricht \bcat\bdem Wort, cataber nicht dem catIn scattered.

Für \Bden Autor wird folgendes Beispiel verwendet:

Bitte geben Sie die neunstellige ID ein

erscheint auf Ihrem farbcodierten Pass-Key.

Verwenden von Regex- \B-\BÜbereinstimmungen -zwischen den Wörtern color - coded. Die Verwendung \b-\bauf der anderen Seite entspricht der -in nine-digitund pass-key.

Wie kommt es, dass wir im ersten Beispiel \btrennen catund im zweiten Beispiel \Btrennen -? Die Verwendung \bim zweiten Beispiel bewirkt das Gegenteil von dem, was zuvor getan wurde.

Bitte erklären Sie mir den Unterschied.

EDIT: Kann jemand bitte mit einem neuen Beispiel erklären?

gerührt
quelle

Antworten:

84

Die Verwirrung rührt von Ihrem Denken her, das \bmit Leerzeichen übereinstimmt (wahrscheinlich, weil "b" "leer" vorschlägt).

\bEntspricht der leeren Zeichenfolge am Anfang oder Ende eines Wortes . \Bstimmt mit der leeren Zeichenfolge überein, die nicht am Anfang oder Ende eines Wortes steht. Der Schlüssel hier ist, dass "-" kein Teil eines Wortes ist. Also <left>-<right>passt, \b-\bweil es auf beiden Seiten des Wortes Wortgrenzen gibt -. Andererseits gibt es für <left> - <right>(beachten Sie die Leerzeichen) keine Wortgrenzen auf beiden Seiten des Bindestrichs. Die Wortgrenzen sind ein Leerzeichen weiter links und rechts.

Auf der anderen Seite \bcat\bverhält sich die Suche nach Wortgrenzen intuitiver und entspricht erwartungsgemäß "cat".

andrewdski
quelle
2
Ja, ich habe tatsächlich ein Leerzeichen verwechselt. Ich bin jedoch immer noch etwas verwirrt. Kann ich Sie um ein weiteres Beispiel bitten?
Stirredo
3
Der Schlüssel ist, dass dies -nicht als Teil eines Wortes betrachtet wird. Ebenso !ist kein Teil eines Wortes. Also wieder \b!\b"uunet! Iamold", aber nicht "Wow! Du bist". Sie können dieses Zeug auf regexpal.com ausprobieren .
Andrewdski
@andrewdski In meinem Fall fängt \ b auch nach Interpunktionen ... Ich habe es mit \ b [A-Z0-9] + \ b am 1987894, 3219800 versucht; 234567, 345261. und es funktioniert gut, ich
erhalte
1
Fügen Sie einfach hinzu, dass eine Arbeit in Regex aus Buchstaben (a - z und A - Z), Ziffern und dem „_“ [Unterstrich] besteht. Alles andere ist kein Wort.
Maralc
Könnte jemand diese Zeile ausarbeiten\B matches the empty string not at the beginning or end of a word
Arun Gowda
68

\bist eine Wortgrenze mit der Breite Null. Speziell:

Übereinstimmungen an der Position zwischen einem Wortzeichen (alles, was mit \ w übereinstimmt) und einem Nicht-Wort-Zeichen (alles, was mit [^ \ w] oder \ W übereinstimmt) sowie am Anfang und / oder Ende der Zeichenfolge, wenn das erste und / oder letzte Zeichen in der Zeichenfolge sind Wortzeichen.

Beispiel: .\bÜbereinstimmungen cinabc

\Bist eine Nicht-Wortgrenze mit einer Breite von Null. Speziell:

Entspricht der Position zwischen zwei Wortzeichen (dh der Position zwischen \ w \ w) sowie der Position zwischen zwei Nichtwortzeichen (dh \ W \ W).

Beispiel: \B.\BÜbereinstimmungen binabc

Weitere Informationen zu regulären Regex finden Sie unter reguläre-Ausdrücke.info

Böhmisch
quelle
10
+1, da die Breite Null ein wichtiger Bestandteil der Definition ist. Wenn es nicht null breit wäre, würde es auch diese Wort- / Nichtwortzeichen im passenden Teil des Musters erfassen.
Ben Hocking
5
Mit anderen Worten, \ B entspricht der Stelle zwischen \ W und \ W oder zwischen \ w und \ w, jedoch nicht zwischen \ W und \ w.
1
Diese Antwort wurde zu den häufig gestellten Fragen zum Stapelüberlauf mit regulären Ausdrücken unter "Anker" hinzugefügt .
Aliteralmind
1
@stephenhuh string.match()kehrt nur das erste Spiel, es sei denn , Sie fügen Sie die globale Flagge g: "abc def".match(/\b./g)Erträge['a', ' ', 'd']
Bohemian
1
Ich denke, das ist die bessere Antwort. Ich sollte auch der Akzeptierte sein, weil es die Verwirrung löst. Hier gibt es noch viel mehr zu lernen.
Wolf
37

Mit einem anderen Beispiel:

Angenommen, dies ist die Zeichenfolge und das Muster, nach dem gesucht werden soll, ist 'cat':

text = "catmania thiscat thiscatmaina";

Nun Definitionen,

'\ b' findet / stimmt mit dem Muster am Anfang oder Ende jedes Wortes überein.

'\ B' findet / stimmt nicht mit dem Muster am Anfang oder Ende jedes Wortes überein.

Verschiedene Fälle:

Fall 1: Am Anfang jedes Wortes

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

Das Ergebnis ist "ctmania thiscat thiscatmaina".

Fall 2: Am Ende jedes Wortes

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

Das Ergebnis ist nun "catmania thisct thiscatmaina".

Fall 3: Nicht am Anfang

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

Das Ergebnis ist nun "catmania thisct thisctmaina".

Fall 4: Nicht am Ende

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

Das Ergebnis ist "ctmania thiscat thisctmaina".

Fall 5: Weder Anfang noch Ende

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

Das Ergebnis ist "catmania thiscat thisctmaina".

Hoffe das hilft :)

Agam
quelle
Korrigieren Sie mich bitte, wenn ich falsch liege, aber wenn Sie \ bcat \ b verwenden, wäre unsere Zeichenfolge beispielsweise "catcat is my cat" => das erste Wort (catcat) hätte auf diese Bedingung angewendet. Nein?.
Kosem
8

Das Metazeichen \ b ist 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.

\ B ist die negierte Version von \ b . \ B stimmt an jeder Position überein, an der \ b nicht übereinstimmt. Tatsächlich stimmt \ B an jeder Position zwischen zwei Wortzeichen sowie an jeder Position zwischen zwei Nichtwortzeichen überein.

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

Daniel Hilgarth
quelle
3

\bentspricht einer Wortgrenze. \BEntspricht Nicht-Wortgrenzen und entspricht (danke an @Alan Moore für die Korrektur!) . Beide sind[^\b](?!\b) eine Breite von Null.

Weitere Informationen finden Sie unter http://www.regular-expressions.info/wordboundaries.html . Die Seite ist äußerst nützlich für viele grundlegende Regex-Fragen.

Matt Ball
quelle
4
\Bist nicht gleichbedeutend mit [^\b]. Eine Zeichenklasse ( [...]oder [^...]) verbraucht genau ein Zeichen, während Zusicherungen mit einer Breite von Null nichts mögen \bund \Bnichts verbrauchen. Wenn Sie \beine Zeichenklasse eingeben, hat dies eine völlig andere Bedeutung: Entspricht [\b]einer Rücktaste und einem [^\b]beliebigen Zeichen mit Ausnahme einer Rücktaste. \Bist wirklich gleichbedeutend mit (?!\b).
Alan Moore
@ Alan danke, du hast vollkommen recht - ich war heute Morgen nicht wach, als ich das schrieb. Fest.
Matt Ball
4
... aber warum jemand eine Rücktaste haben möchte, ist mir ein Rätsel. : D
Alan Moore
1

Nehmen wir eine Zeichenfolge wie:

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

Hinweis: Der Unterstrich (_) wird in diesem Fall nicht als Sonderzeichen betrachtet.

  1. /\bX\b/g Sollte mit einem Sonderzeichen oder Leerzeichen beginnen und enden

XIX XX IXI X I II II IIXX XXII XX - X XX -I I- XX - -I- XX -I I- XX -I- X_X _X-


  1. /\bX/g Sollte mit einem Sonderzeichen oder einem Leerzeichen beginnen

X IX IXI X X X I II IIXX X XII II X - X - X X - X -I IX - X - -I- X - X -I IX - X -I- X _X _X-


  1. /X\b/g Sollte mit einem Sonderzeichen oder einem Leerzeichen enden

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
    Sollte nicht beginnen und mit einem Sonderzeichen oder nicht enden

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/g Sollte nicht mit einem Sonderzeichen oder beginnen

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/gSollte nicht mit einem Sonderzeichen oder Leerzeichen enden

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/gSollte mit einem Sonderzeichen oder einem Leerzeichen beginnen und nicht enden

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 Sollte nicht beginnen und mit einem Sonderzeichen oder Leerzeichen enden

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

Kartik Patodi
quelle
1

Quelle © Copyright RexEgg.com

Wortgrenze: \ b *

Die Wortgrenze \ b entspricht Positionen, an denen eine Seite ein Wortzeichen ist (normalerweise ein Buchstabe, eine Ziffer oder ein Unterstrich - siehe unten für Variationen zwischen den Engines) und die andere Seite kein Wortzeichen ist (zum Beispiel kann es der Anfang von sein die Zeichenfolge oder ein Leerzeichen).

Der reguläre Ausdruck \ bcat \ b würde daher mit Katze in einer schwarzen Katze übereinstimmen, aber nicht mit Katatonik, Kater oder Zertifikat. Wenn Sie eine der Grenzen entfernen, würde \ bcat mit Katze in Wels übereinstimmen, und Katze \ b würde mit Katze in Kater übereinstimmen, aber nicht umgekehrt. Beide würden natürlich alleine zur Katze passen.

Keine Wortgrenze: \ B.

\ B stimmt mit allen Positionen überein, an denen \ b nicht übereinstimmt. Daher passt es:

✽ Wenn keine Seite ein Wortzeichen ist, z. B. an einer beliebigen Stelle in der Zeichenfolge $ = (@ -% ++) (einschließlich Anfang und Ende der Zeichenfolge)

✽ Wenn beide Seiten ein Wortzeichen sind, zum Beispiel zwischen dem H und dem i in Hi!

Dies mag nicht sehr nützlich erscheinen, aber manchmal ist \ B genau das, was Sie wollen. Zum Beispiel,

✽ \ Bcat \ B findet die Katze vollständig von Wortzeichen umgeben, wie im Zertifikat, jedoch weder für sich noch am Anfang oder Ende von Wörtern.

✽ cat \ B findet Katze sowohl im Zertifikat als auch im Wels, jedoch weder im Kater noch allein.

✽ \ Bcat findet Katze sowohl im Zertifikat als auch im Kater, aber weder im Wels noch allein.

✽ \ Bcat | cat \ B findet eine Katze in einer eingebetteten Situation, z. B. in einem Zertifikat, einem Wels oder einem Kater, jedoch nicht allein.

Ganesh MS
quelle
1

\ b wird als Wortgrenze verwendet

word = "categorical cat"

Finde alle "Katzen" im obigen Wort

ohne \ b

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

mit B

re.findall(r'\bcat\b',word)
['cat']
Kavyajeet Bora
quelle
0

\Bist nicht \b zB negativ \b

pass-keyHier gibt es keine Wortgrenze, -damit sie übereinstimmt\B in Ihrem ersten Beispiel Es gibt eine Wortgrenze neben cat, damit sie übereinstimmt\b

Ähnliche Regeln gelten auch für andere. \Wist negativ von \w \UPPER CASEist negativ von\LOWER CASE

Neel Basu
quelle