Różnica między \ w i \ b metaznakami wyrażenia regularnego
142
Czy ktoś może wyjaśnić różnicę między metaznakami \bi \wwyrażeniami regularnymi? Rozumiem, że oba te metaznaki są używane jako granice słów. Poza tym, która meta postać jest skuteczna w przypadku treści wielojęzycznych?
\woznacza słowo charakter , natomiast \bstanowi wyraz granicę między znakiem słowa i nie ma charakteru tekstu. To nie to samo.
BoltClock
Odpowiedzi:
259
Metaznak \bjest kotwicą, podobnie jak daszek i znak dolara. Dopasowuje w pozycji zwanej „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.
Mówiąc najprościej: \bumożliwia wyszukanie „tylko całych słów” przy użyciu wyrażenia regularnego w postaci \bword\b. Znak „Słowo” to znak, który może być używany do tworzenia słów. Wszystkie znaki, które nie są „znakami słownymi”, są „znakami innymi niż słowa” .
We wszystkich odmianach, znaki [a-zA-Z0-9_]są znakami słownymi. Są one również dopasowywane przez klasę postaci z krótką ręką \w. Smaki pokazujące „ascii” dla granic słów w porównaniu smaków rozpoznają je tylko jako znaki słów.
\woznacza zwykle „znak słowa”[A-Za-z0-9_] . Zwróć uwagę na podkreślenie i cyfry.
\Bjest zanegowaną wersją \b. \Bpasuje na każdej pozycji, w której \bnie. W efekcie \Bdopasowuje w dowolnym miejscu między dwoma znakami słowa, a także w dowolnym miejscu między dwoma znakami innymi niż słowo.
\wdopasowuje znak słowa. \bjest dopasowaniem o zerowej szerokości, które pasuje do znaku pozycji, który ma znak słowa po jednej stronie i coś, co nie jest znakiem słowa po drugiej. (Przykłady rzeczy, które nie są znakami słów, obejmują spacje, początek i koniec ciągu itp.)
\wdopasowania a, b, c, d, e, a fw "abc def" \bzgadzał się z (zerowej szerokości) Pozycja przed a, po c, przed d, jak i po fw"abc def"
Bardziej poprawne jest stwierdzenie, że jest to granica między znakiem słowa, a nie znakiem słowa, ponieważ pasuje również między znakiem słowa a początkiem lub końcem ciągu, jeśli ten znak znajduje się na początku / końcu ciągu.
MRAB
5
Nadal nie jest w porządku. \btwierdzenie o zerowej szerokości; nie pasuje do znaku , dopasowuje pozycję .
Alan Moore,
10
@Mahender, prawdopodobnie miałeś na myśli różnicę między \W(zamiast \w) a \b. Jeśli nie, to zgodziłbym się z @BoltClock i @jwismar powyżej. W przeciwnym razie kontynuuj czytanie.
\Wdopasowałby dowolny znak niebędący słowem, więc łatwo jest go użyć do dopasowania granic słów. Problem polega na tym, że nie pasuje do początku lub końca wiersza. \bjest bardziej odpowiedni do dopasowywania granic słów, ponieważ dopasowuje również początek lub koniec wiersza. Z grubsza rzecz biorąc (bardziej doświadczeni użytkownicy mogą mnie tutaj poprawić) \bmożna uznać za (\W|^|$). [Edytuj: jak @ Ωmega wspomina poniżej, \bjest dopasowaniem o zerowej długości, więc (\W|^|$)nie jest do końca poprawne, ale mam nadzieję, że pomoże wyjaśnić różnicę]
Krótki przykład: dla struny Hello World, .+\Wby dopasować Hello_(z miejsca), ale nie będzie pasował World. .+\bpasuje zarówno do, jak Helloi World.
Nie zgadzam się co do \bznaczenia tego samego co (\W|^|$), ponieważ (\W|^|$)będzie zawierał znak niebędący słowem w dopasowanym wyniku. Możesz sprawdzić ten fakt tutaj => regexr.com/3qf98 .
Victor,
\bdla mnie oznacza to samo, co (?<=\W|^|$)gdy jest używane przed wzorem i (?=\W|^|$)gdy jest używane po wzorze. Możesz sprawdzić, o czym mówię tutaj => regexr.com/3qf9h . Po prostu porównaj z wynikiem \bzakotwiczeń tutaj => regexr.com/3qf9t
Victor,
4
\b <= this is a word boundary.
Dopasowuje pozycję, po której następuje znak słowa, ale nie jest poprzedzona znakiem słowa lub która jest poprzedzona znakiem słowa, ale nie jest poprzedzona znakiem słowa.
\w <= stands for "word character".
Zawsze pasuje do znaków ASCII [A-Za-z0-9_]
Czy jest coś konkretnego, co próbujesz dopasować?
Niektóre przydatne witryny wyrażeń regularnych dla początkujących lub po prostu zaspokajające apetyt.
To dobra odpowiedź, ale warto pamiętać, że \wnie zawsze jest to odpowiednik znaków ASCII [A-Za-z0-9_]- będzie również pasować do alfanumerycznych punktów kodowych Unicode i może dopasować 8-bitowe znaki ISO-Latin-1, jeśli ustawienia regionalne są odpowiednio ustawione .
Tim Pierce,
2
\wto nie granica słowo, to słowo pasuje dowolny znak podkreślenia, w tym: [a-zA-Z0-9_]. \bjest granicą słowa, to znaczy dopasowuje pozycję między słowem a znakiem niealfanumerycznym: \Wlub [^\w].
Te implementacje mogą się jednak różnić w zależności od języka.
\w
oznacza słowo charakter , natomiast\b
stanowi wyraz granicę między znakiem słowa i nie ma charakteru tekstu. To nie to samo.Odpowiedzi:
Metaznak
\b
jest kotwicą, podobnie jak daszek i znak dolara. Dopasowuje w pozycji zwanej „granicą słowa” . To dopasowanie ma zerową długość.Istnieją trzy różne pozycje, które kwalifikują się jako granice słów:
Mówiąc najprościej:
\b
umożliwia wyszukanie „tylko całych słów” przy użyciu wyrażenia regularnego w postaci\bword\b
. Znak „Słowo” to znak, który może być używany do tworzenia słów. Wszystkie znaki, które nie są „znakami słownymi”, są „znakami innymi niż słowa” .We wszystkich odmianach, znaki
[a-zA-Z0-9_]
są znakami słownymi. Są one również dopasowywane przez klasę postaci z krótką ręką\w
. Smaki pokazujące „ascii” dla granic słów w porównaniu smaków rozpoznają je tylko jako znaki słów.\w
oznacza zwykle „znak słowa”[A-Za-z0-9_]
. Zwróć uwagę na podkreślenie i cyfry.\B
jest zanegowaną wersją\b
.\B
pasuje na każdej pozycji, w której\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.\W
jest skrótem[^\w]
od zanegowanej wersji\w
.źródło
\w
dopasowuje znak słowa.\b
jest dopasowaniem o zerowej szerokości, które pasuje do znaku pozycji, który ma znak słowa po jednej stronie i coś, co nie jest znakiem słowa po drugiej. (Przykłady rzeczy, które nie są znakami słów, obejmują spacje, początek i koniec ciągu itp.)\w
dopasowaniaa
,b
,c
,d
,e
, af
w"abc def"
\b
zgadzał się z (zerowej szerokości) Pozycja przeda
, poc
, przedd
, jak i pof
w"abc def"
Zobacz: http://www.regular-expressions.info/reference.html/
źródło
\b
twierdzenie o zerowej szerokości; nie pasuje do znaku , dopasowuje pozycję .@Mahender, prawdopodobnie miałeś na myśli różnicę między
\W
(zamiast\w
) a\b
. Jeśli nie, to zgodziłbym się z @BoltClock i @jwismar powyżej. W przeciwnym razie kontynuuj czytanie.\W
dopasowałby dowolny znak niebędący słowem, więc łatwo jest go użyć do dopasowania granic słów. Problem polega na tym, że nie pasuje do początku lub końca wiersza.\b
jest bardziej odpowiedni do dopasowywania granic słów, ponieważ dopasowuje również początek lub koniec wiersza. Z grubsza rzecz biorąc (bardziej doświadczeni użytkownicy mogą mnie tutaj poprawić)\b
można uznać za(\W|^|$)
. [Edytuj: jak @ Ωmega wspomina poniżej,\b
jest dopasowaniem o zerowej długości, więc(\W|^|$)
nie jest do końca poprawne, ale mam nadzieję, że pomoże wyjaśnić różnicę]Krótki przykład: dla struny
Hello World
,.+\W
by dopasowaćHello_
(z miejsca), ale nie będzie pasowałWorld
..+\b
pasuje zarówno do, jakHello
iWorld
.źródło
\b
znaczenia tego samego co(\W|^|$)
, ponieważ(\W|^|$)
będzie zawierał znak niebędący słowem w dopasowanym wyniku. Możesz sprawdzić ten fakt tutaj => regexr.com/3qf98 .\b
dla mnie oznacza to samo, co(?<=\W|^|$)
gdy jest używane przed wzorem i(?=\W|^|$)
gdy jest używane po wzorze. Możesz sprawdzić, o czym mówię tutaj => regexr.com/3qf9h . Po prostu porównaj z wynikiem\b
zakotwiczeń tutaj => regexr.com/3qf9tDopasowuje pozycję, po której następuje znak słowa, ale nie jest poprzedzona znakiem słowa lub która jest poprzedzona znakiem słowa, ale nie jest poprzedzona znakiem słowa.
Zawsze pasuje do znaków ASCII [A-Za-z0-9_]
Czy jest coś konkretnego, co próbujesz dopasować?
Niektóre przydatne witryny wyrażeń regularnych dla początkujących lub po prostu zaspokajające apetyt.
Uważam, że to bardzo przydatna książka:
źródło
\w
nie zawsze jest to odpowiednik znaków ASCII[A-Za-z0-9_]
- będzie również pasować do alfanumerycznych punktów kodowych Unicode i może dopasować 8-bitowe znaki ISO-Latin-1, jeśli ustawienia regionalne są odpowiednio ustawione .\w
to nie granica słowo, to słowo pasuje dowolny znak podkreślenia, w tym:[a-zA-Z0-9_]
.\b
jest granicą słowa, to znaczy dopasowuje pozycję między słowem a znakiem niealfanumerycznym:\W
lub[^\w]
.Te implementacje mogą się jednak różnić w zależności od języka.
źródło