Verschil tussen \b en \B in regex

Ik ben een boek aan het lezen over reguliere expressie en ik kwam dit voorbeeld tegen voor \b:

De kat verspreidde zijn eten door de kamer.

Regex gebruiken – \bcat\bkomt overeen met het woord catmaar niet met de catin scattered.

Voor \bgebruikt de auteur het volgende voorbeeld:

Voer de negencijferige id in zoals deze is

verschijnt op uw kleurgecodeerde toegangscode.

Het gebruik van regex \b-\bkomt overeen met -tussen het woord color - coded. Het gebruik van \b-\bdaarentegen komt overeen met de -in nine-digiten pass-key.

Hoe komt het dat we in het eerste voorbeeld \bgebruiken om catte scheiden en in het tweede voorbeeld \bgebruiken om -? Het gebruik van \bin het tweede voorbeeld doet het tegenovergestelde van wat het eerder deed.

Leg me het verschil uit.

EDIT: Kan iemand het ook uitleggen met een nieuw voorbeeld?


Antwoord 1, autoriteit 100%

De verwarring komt voort uit uw denken dat \bovereenkomt met spaties (waarschijnlijk omdat “b” “leeg” suggereert).

\bkomt overeen met de lege tekenreeks aan het begin of einde van een woord. \bkomt overeen met de lege tekenreeks die niet aan het begin of einde van een woord staat. De sleutel hier is dat “-” geen deel uitmaakt van een woord. Dus <left>-<right>komt overeen met \b-\bomdat er aan weerszijden van de -woordgrenzen zijn. Aan de andere kant voor <left> - <right>(let op de spaties), er zijn geen woordgrenzen aan weerszijden van het streepje. De woordgrenzen staan één spatie verder naar links en rechts.

Aan de andere kant, bij het zoeken naar \bcat\bgedragen woordgrenzen zich intuïtiever en komt het overeen met “kat” zoals verwacht.


Antwoord 2, autoriteit 69%

\bis een woordgrens van nul breedte. Specifiek:

Komt overeen op de positie tussen een woordteken (alles dat overeenkomt met \w) en een niet-woordteken (alles dat overeenkomt met [^\w] of \W), evenals aan het begin en/of einde van de tekenreeks als de eerste en/of laatste tekens in de tekenreeks woordtekens zijn.

Voorbeeld: .\bkomt overeen met cin abc

\bis een nul-breedte niet-woord grens. Specifiek:

Komt overeen op de positie tussen twee woordtekens (d.w.z. de positie tussen \w\w) en op de positie tussen twee niet-woordtekens (d.w.z. \W\W).

Voorbeeld: \B.\Bkomt overeen met bin abc

Zie regular-expressions.infovoor meer geweldige regex-info


Antwoord 3, autoriteit 41%

Met een ander voorbeeld:

Bedenk dat dit de tekenreeks is en het patroon waarnaar moet worden gezocht is ‘kat’:

text = "catmania thiscat thiscatmaina";

Nu definities,

‘\b’zoekt/komt overeen met het patroon aan het begin of einde van elk woord.

‘\B’vindt/komt niet overeen met het patroon aan het begin of einde van elk woord.

Verschillende gevallen:

Geval 1: Aan het begin van elk woord

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

Het resultaat is nu “ctmania thiscat thiscatmaina”

Geval 2: Aan het einde van elk woord

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

Nu, resultaat is “Catmania ThisCTMATMAINA”

Case 3: Niet in het begin

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

Nu, resultaat is “Catmania ThisctMAINA”

Case 4: Niet uiteindelijk

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

Nu, resultaat is “ctmania thiscat thisctmaina”

Case 5: Niet begin noch beëindig

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

Nu, resultaat is “Catmania thiscat thisctmaina”

Ik hoop dat dit helpt 🙂


4, Autoriteit 9%

De metacharacter \ B is een anker zoals de caret en het dollarteken. Het komt overeen met een positie die een “woordgrens” wordt genoemd. Deze match is nul-lengte.

Er zijn drie verschillende posities die in aanmerking komen als woordgrenzen:

  • vóór het eerste teken in de string, als het eerste teken een woordkarakter is.
  • Na het laatste teken in de string, als het laatste teken een woordkarakter is.
  • tussen twee tekens in de tekenreeks, waar men een woordkarakter is en de andere geen woordkarakter is.

\ b is de genegeerde versie van \ b . \ B komt overeen met elke positie waar \ b niet. Effectief, \ b komt overeen met elke positie tussen twee woordpersonages en op elke positie tussen twee niet-woord tekens.

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


5, Autoriteit 3%

\bkomt overeen met een woordgrens. \bkomt overeen met niet-woordgrenzen en is gelijk aan [^\b](?!\b)(met dank aan @Alan Moorevoor de correctie!). Beide zijn nul-breedte.

Zie http://www.regular-expressions.info/wordboundaries.htmlvoor details. De site is erg handig voor veel standaard regex-vragen.


Antwoord 6, autoriteit 3%

Bron© Copyright RexEgg.com

Woordgrens: \b*

De woordgrens \b komt overeen met posities waar de ene kant een woordteken is (meestal een letter, cijfer of onderstrepingsteken, maar zie hieronder voor variaties tussen engines) en de andere kant geen woordteken is (het kan bijvoorbeeld het begin van de tekenreeks of een spatie).

De regex \bcat\b zou daarom overeenkomen met kat in een zwarte kat, maar niet in catatonisch, kater of certificaat. Door een van de grenzen te verwijderen, zou \bcat overeenkomen met kat in meerval, en kat\b zou overeenkomen met kat in kater, maar niet omgekeerd. Beide zouden natuurlijk op zichzelf passen bij de kat.

Geen-woord-grens: \B

\B komt overeen met alle posities waar \b niet overeenkomt. Daarom komt het overeen met:

✽ Wanneer geen van beide zijden een woordteken is, bijvoorbeeld op een willekeurige positie in de tekenreeks $=(@-%++) (inclusief het begin en einde van de tekenreeks)

✽ Als beide zijden een woordteken zijn, bijvoorbeeld tussen de H en de i in Hi!

Dit lijkt misschien niet erg handig, maar soms is \B precies wat je wilt. Bijvoorbeeld,

✽ \Bcat\B vindt kat volledig omringd door woordtekens, zoals in certificaat, maar niet op zichzelf, noch aan het begin of einde van woorden.

✽ cat\B vindt kat zowel in certificaat als meerval, maar niet in kater of alleen.

✽ \Bcat vindt kat zowel in certificaat als kater, maar niet in meerval of alleen.

✽ \Bcat|cat\B zal cat vinden in embedded situatie, b.v. in certificaat, meerval of kater, maar niet alleen.


Antwoord 7, autoriteit 3%

\b wordt gebruikt als woordgrens

word = "categorical cat"

Zoek alle “kat” in het bovenstaande woord

zonder \b

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

met \b

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

Antwoord 8

\bis niet\bb.v. negatief\b

pass-keyhier is geen woordgrens naast -dus het komt overeen met \bin uw eerste voorbeeld is er een woordgrens naast kat dus het komt overeen met \b

vergelijkbare regels gelden ook voor anderen. \wis negatief van \w\UPPER CASEis negatief van \LOWER CASE

Other episodes