/ /. *? nie pasuje do znaku przed granicą słowa - c #, regex, .net-4.5

. *? nie pasuje do znaku przed granicą wyrazów - c #, regex, .net-4.5

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 № 1

To 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ę?