Trudno mi zrozumieć dlaczego ((?i)bb.*?b)
zwraca b
i nie b-
dla sznurka a b- c
. Próbowałem też ((?i)bbw*b)
, ale to nie działa lepiej.
Niektóre dodatkowe informacje:
Muszę dopasować słowa w tekście. Muszę pobrać wszystkie słowa, które zaczynają się od litery b
. A „słowa” oznaczają prawie każdy ciąg znaków rozpoczynający się od a b
, Jak na przykład b
, b-
, b"
, b"
itd. „Słowa”, które muszę dopasować, nie są oczywiście ograniczone spacją, taką jak w przykładzie.
Odpowiedzi:
1 dla odpowiedzi № 1To powinno dać pożądany rezultat:
(b.*?)(?:s|$)
Przetestowałem to a b- c bfdf b32=" dfa b. b---s asd b
.
Wygląda na to, że nie szukasz słowa ale dowolny ciąg rozpoczynający się literą „b” ograniczoną spacją (lub inną?) postacią. Twój oryginalny wzór nie może działać, ponieważ „-” nie kwalifikuje się jako część słowa. Powodzenia.
Uwaga: Powyższy wzór jest bardzo prosty, ostatnia część z $ jest tam, więc zostaje przechwycone ostatnie „b”, które znajduje się na końcu linii.
1 dla odpowiedzi nr 2
*
nazywa się „chciwym” kwantyfikator. Dopasuje tyle powtórzeń poprzedniego wzorca, ile to możliwe. Przez większość czasu jest to dokładnie to, czego chcesz, ale czasami chcesz użyć „leniwego” kwantyfikatora, co oznacza, że „będzie pasował jako mało jak to możliwe, w tym 0.
Aby kwantyfikator był „leniwy”, należy dodać znak zapytania: *?
, +?
, ??
itp.
Teraz kolejna część odpowiedzi brzmi: jak granice słów praca. Granice słów będą pasować do pozycja gdzie jest „przerwa” między „znakami słownymi” (0-9, a-z i _) i „znakami innymi niż słowa”. -
to znak inny niż słowo, więc pozycje między b-
, -c
i c
wszyscy by działali.
Ponieważ masz leniwy kwantyfikator, a tuż za nim znajduje się granica słowa b
, to wszystko, co pasuje do twojego wyrażenia regularnego.
Zamiast próbować użyć granicy słowa, aby znaleźć koniec słowa, po prostu dopasuj znaki słowne i kreski, tak, aby w naturalny sposób dopasować wszystko do „końca” słowa:
bb[-w]*
Zobacz przykład pracy
0 dla odpowiedzi № 3
.*?
jest minimalny, więc b.*?b
znajduje pierwszą granicę słowa po b
. Od b
to znak słowny, i -
nie jest to, że pierwsza granica słowa znajduje się między tymi znakami.
ETA: Rzecz w tym, regexen nie uważa twoich „słów” za słowa, więc b
nie będzie dla nich pracować. Mówisz, że „słowa” nie zawsze kończą się spacją. I oczywiście nie zakończą się myślnikiem. Jak, dokładniej, kończą się?