Potrzebuję wyrażenia regularnego, które będzie pasować, blahfooblah
ale nieblahfoobarblah
Chcę, żeby pasowało tylko do foo i wszystkiego dookoła foo, o ile nie następuje po nim bar.
Próbowałem użyć tego: foo.*(?<!bar)
co jest dość bliskie, ale pasuje blahfoobarblah
. Negatywne spojrzenie z tyłu musi pasować do wszystkiego, a nie tylko do paska.
Specyficznym językiem, którego używam, jest Clojure, który używa wyrażeń regularnych Java pod maską.
EDYCJA: Dokładniej, potrzebuję tego, blahfooblahfoobarblah
ale nie blahfoobarblahblah
.
Odpowiedzi:
Próbować:
Testy:
Wyjaśnienie wyrażeń regularnych
Inne wyrażenie regularne
Jeśli chcesz wykluczyć tylko
bar
wtedy, gdy jest bezpośrednio pofoo
, możesz użyćEdytować
Zaktualizowałeś swoje pytanie, aby było bardziej szczegółowe.
Nowe testy
Nowe wyjaśnienie
(?=.*foo(?!bar))
zapewnia, żefoo
zostanie znaleziony, ale nie następuje bezpośredniobar
źródło
foo
ale niefoobar
. Aby dopasować,bot
ale niebotters
, użyjesz/(?=.*bot(?!ters))^(\w+)$/
.Aby dopasować
foo
następujące elementy do czegoś, od czego nie zaczynabar
, spróbujTwoja wersja z negatywnym lookbehind jest efektywnie „dopasuj a,
foo
po którym następuje coś, co nie kończy się nabar
”. W.*
meczu o wszystkobarblah
, i(?<!bar)
patrzy nalah
i sprawdza, czy nie pasujebar
, które nie, więc cały dopasowania wzorca.źródło
Zamiast tego użyj negatywnego spojrzenia w przyszłość:
To zadziałało dla mnie, mam nadzieję, że pomoże. Powodzenia!
źródło
Napisałeś komentarz sugerujący, że podoba Ci się dopasowywanie wszystkich słów w ciągu, a nie całego ciągu.
Zamiast mieszać to wszystko w komentarzu, zamieszczam to jako nową odpowiedź.
New Regex
Przykładowy tekst
mecze
źródło
Twoja konkretna prośba o dopasowanie może zostać dopasowana przez:
To będzie pasować,
blahfooblahfoobarblah
ale nieblahfoobarblahblah
.Problem z regex z
foo.*(?<!bar)
jest.*
pofoo
. Dopasowuje tyle dowolnych znaków, w tym znaki pobar
.źródło