Różnica między \ b i \ B w wyrażeniu regularnym


103

Czytam książkę o wyrażeniach regularnych i natknąłem się na ten przykład dla \b:

Kot porozrzucał jedzenie po całym pokoju.

Użycie wyrażenia regularnego - \bcat\bdopasuje słowo, catale nie będzie zawierało catin scattered.

Dla \Bautora używa następujący przykład:

Wprowadź dziewięciocyfrowy identyfikator

pojawia się na Twoim kluczu kodowanym kolorem.

Używanie \B-\Bdopasowań wyrażeń regularnych -między słowami color - coded. Użycie \b-\bz drugiej strony dopasowuje -in nine-digiti pass-key.

Jak to się dzieje w pierwszym przykładzie, którego używamy \bdo oddzielania, cata w drugim \Bdo oddzielania -? Użycie \bw drugim przykładzie działa odwrotnie niż wcześniej.

Proszę wyjaśnij mi różnicę.

EDYCJA: Czy ktokolwiek może wyjaśnić na nowym przykładzie?

Odpowiedzi:


84

Zamieszanie wynika z tego, że myślisz \bdopasowując spacje (prawdopodobnie dlatego, że „b” sugeruje „puste”).

\bdopasowuje pusty ciąg na początku lub na końcu słowa . \Bdopasowuje pusty ciąg nie na początku ani na końcu słowa. Kluczem jest to, że „-” nie jest częścią słowa. Więc <left>-<right>pasuje, \b-\bponieważ istnieją granice słów po obu stronach -. Z drugiej strony dla<left> - <right> (zwróć uwagę na spacje) po obu stronach myślnika nie ma granic słów. Granice słów są o jedno miejsce dalej po lewej i prawej stronie.

Z drugiej strony podczas wyszukiwania \bcat\bgranic słów zachowuj się bardziej intuicyjnie i dopasowuje słowo „kot” zgodnie z oczekiwaniami.


2
Tak, rzeczywiście myliłem \ b puste miejsce. Jednak nadal czuję się trochę zdezorientowany. Czy mogę prosić o jeszcze jeden przykład?
stiro

3
Kluczem jest to, że -nie jest uważane za część słowa. Podobnie !nie jest częścią słowa. Więc ponownie \b!\bdopasowuje „uunet! Iamold”, ale nie „Wow! You are”. Możesz wypróbować te rzeczy na regexpal.com .
andrewdski 13.07.11

@andrewdski W moim przypadku \ b łapie również znaki interpunkcyjne ... Próbowałem z \ b [A-Z0-9] + \ b na 1987894, 3219800; 234567, 345261. i działa dobrze, otrzymuję tylko liczby
gunzapper

1
Wystarczy dodać, że praca w wyrażeniu regularnym składa się z liter (a– z i A– Z), cyfr i „_” [podkreślenie]). Wszystko inne to nie słowo.
Maralc

Czy ktoś mógłby rozwinąć tę linię\B matches the empty string not at the beginning or end of a word
Arun Gowda

68

\bjest granicą słowa o zerowej szerokości. Konkretnie:

Dopasowuje na pozycji między znakiem słowa (cokolwiek dopasowanego przez \ w) a znakiem niebędącym słowem (cokolwiek dopasowanym przez [^ \ w] lub \ W), a także na początku i / lub końcu ciągu, jeśli pierwszy i / lub ostatnie znaki w ciągu to znaki słów.

Przykład: .\bpasuje cdoabc

\Bjest granicą bez słów o zerowej szerokości. Konkretnie:

Dopasowuje na pozycji między dwoma znakami słowa (tj. Między \ w \ w), jak również na pozycji między dwoma znakami innymi niż słowo (tj. \ W \ W).

Przykład: \B.\Bpasuje bdoabc

Zobacz regular-expressions.info, aby uzyskać więcej przydatnych informacji o wyrażeniach regularnych


10
+1, ponieważ zerowa szerokość jest ważną częścią definicji. Gdyby nie miał zerowej szerokości, przechwyciłby również te znaki słowa / nie-słowa z pasującej części wzorca.
Ben Hocking,

5
Innymi słowy, \ B dopasowuje miejsce między \ W i \ W lub między \ w a \ w, ale nie między \ W i \ w.

1
Ta odpowiedź została dodana do często zadawanych pytań dotyczących wyrażeń regularnych przepełnienia stosu , w sekcji „Kotwice”.
aliteralmind

1
@stephenhuh string.match()zwraca tylko pierwsze dopasowanie, chyba że dodasz flagę globalnąg : "abc def".match(/\b./g)zwraca['a', ' ', 'd']
Bohemian

1
Myślę, że to lepsza odpowiedź. Powinienem też być akceptowany, ponieważ rozwiązuje to zamieszanie. Dużo więcej do nauczenia się tutaj.
Wolf

38

Na innym przykładzie:

Rozważmy, że jest to ciąg, a wzór do wyszukania to „kot”:

text = "catmania thiscat thiscatmaina";

Teraz definicje,

'\b' znajduje / dopasowuje wzorzec na początku lub na końcu każdego słowa.

'\B' nie znajduje / nie dopasowuje wzorca na początku lub na końcu każdego słowa.

Różne przypadki:

Przypadek 1: na początku każdego słowa

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

Teraz wynikiem jest „ctmania thiscat thiscatmaina”

Przypadek 2: na końcu każdego słowa

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

Teraz wynikiem jest „catmania thisct thiscatmaina”

Przypadek 3: nie na początku

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

Teraz wynik to „catmania thisct thisctmaina”

Przypadek 4: nie do końca

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

Teraz wynikiem jest „ctmania thiscat thisctmaina”

Przypadek 5: Ani początek, ani koniec

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

Teraz wynikiem jest „catmania thiscat thisctmaina”

Mam nadzieję że to pomoże :)


Popraw mnie, jeśli się mylę, ale przy użyciu \ bcat \ b, gdyby nasz ciąg znaków wyglądał na przykład: "catcat is my cat" => pierwsze słowo (catcat) byłoby zastosowane do tego warunku. Nie?.
Kosem

8

Metaznak \ b jest kotwicą, podobnie jak daszek i znak dolara. Dopasowuje w pozycji nazywanej „granicą słowa”. To dopasowanie ma zerową długość.

Istnieją trzy różne pozycje, które kwalifikują się jako granice słów:

  • Przed pierwszym znakiem w ciągu, jeśli pierwszy znak jest znakiem słowa.
  • Po ostatnim znaku w ciągu, jeśli ostatni znak jest znakiem słowa.
  • Między dwoma znakami w ciągu, gdzie jeden jest znakiem słowa, a drugi nie jest znakiem słowa.

\ B to zanegowana wersja \ b . \ B pasuje w każdym miejscu, gdzie \ b nie. W efekcie \ B dopasowuje w dowolnym miejscu między dwoma znakami słowa, a także w dowolnym miejscu między dwoma znakami innymi niż słowo.

Źródło: http://www.regular-expressions.info/wordboundaries.html


3

\bdopasowuje granicę słowa. \Bdopasowuje bez granic słów i jest równoważne (dzięki @Alan Moore za poprawkę!) . Obie mają zerową szerokość.[^\b](?!\b)

Szczegółowe informacje można znaleźć pod adresem http://www.regular-expressions.info/wordboundaries.html . Witryna jest niezwykle przydatna w przypadku wielu podstawowych pytań dotyczących wyrażeń regularnych.


4
\Bnie jest równoważne [^\b]. Klasa znaku ( [...]lub [^...]) zużywa dokładnie jeden znak, podczas gdy asercje o zerowej szerokości lubią \bi \Bniczego nie zużywają. Jeśli umieścisz \bklasę znaków, ma to zupełnie inne znaczenie: [\b]dopasowuje backspace i [^\b]dopasowuje dowolny znak z wyjątkiem backspace. \Bjest naprawdę odpowiednikiem (?!\b).
Alan Moore

@Alan dzięki, masz całkowitą rację - nie spałem dziś rano, kiedy to pisałem. Naprawiony.
Matt Ball,

4
... ale dlaczego ktoś chciałby dopasować backspace jest poza mną. : D
Alan Moore,

1

Weźmy ciąg taki jak:

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

Uwaga: w tym przypadku podkreślenie (_) nie jest traktowane jako znak specjalny.

  1. /\bX\b/g Powinien zaczynać się i kończyć znakiem specjalnym lub białą spacją

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


  1. /\bX/g Powinien zaczynać się od znaku specjalnego lub białej spacji

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


  1. /X\b/g Powinien kończyć się znakiem specjalnym lub białą spacją

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
    Nie powinien zaczynać się ani kończyć znakiem specjalnym ani białą spacją

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/gNie powinien zaczynać się od znaku specjalnego ani białej spacji

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/gNie powinien kończyć się znakiem specjalnym ani białą spacją

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/gPowinien zaczynać się i nie kończyć znakiem specjalnym lub białą spacją

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/gNie powinien zaczynać się i powinien kończyć się znakiem specjalnym lub białą spacją

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


1

Źródło © Copyright RexEgg.com

Granica słowa: \ b *

Granica słowa \ b pasuje do pozycji, w których jedna strona jest znakiem słowa (zwykle jest to litera, cyfra lub podkreślenie - ale zobacz poniżej różnice w różnych wyszukiwarkach), a druga strona nie jest znakiem słowa (na przykład może to być początek ciąg lub znak spacji).

Wyrażenie regularne \ bcat \ b pasowałoby zatem do kota w czarnym kocie, ale nie pasowałoby do niego w katatonice, kocurku lub certyfikacie. Usuwając jedną z granic, \ bcat dopasowałoby cat do catfish, a cat \ b pasowałoby do cat in tomcat, ale nie odwrotnie. Oba oczywiście pasowałyby do kota samodzielnie.

Nie-słowo-granica: \ B

\ B pasuje do wszystkich pozycji, w których nie pasuje \ b. Dlatego pasuje do:

✽ Gdy żadna ze stron nie jest słowem, na przykład w dowolnej pozycji w ciągu $ = (@ -% ++) (łącznie z początkiem i końcem ciągu)

✽ Gdy obie strony są słowem, na przykład między literą H i i w Hi!

Może się to wydawać mało przydatne, ale czasami \ B jest tym, czego chcesz. Na przykład,

✽ \ Bcat \ B znajdzie kota całkowicie otoczonego znakami słów, jak w certyfikacie, ale ani samodzielnie, ani na początku lub na końcu słów.

✽ kot \ B znajdzie kota zarówno w certyfikacie, jak i suma, ale ani u kocura, ani w pojedynkę.

✽ \ Bcat znajdzie kota zarówno w certyfikacie, jak i kocur, ale ani w sumie, ani w pojedynkę.

✽ \ Bcat | cat \ B znajdzie kota w sytuacji osadzonej, np. W certyfikacie, suma lub kocura, ale nie samodzielnie.


1

\ b służy jako granica słowa

word = "categorical cat"

Znajdź wszystkie „kot” w powyższym słowie

bez \ b

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

z B

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

0

\Bnie jest \bnp. negatywna \b

pass-keytutaj nie ma granicy słowa, -więc pasuje \Bw pierwszym przykładzie, obok cat jest granica słowa, więc pasuje\b

podobne zasady dotyczą także innych. \Wjest minusem \w \UPPER CASEjest minusem\LOWER CASE

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.