regex do dopasowania czegoś, jeśli nie jest poprzedzone czymś innym


164

Tak więc w przypadku wyrażenia regularnego w Javie chcę napisać wyrażenie regularne, które będzie pasowało wtedy i tylko wtedy, gdy wzorzec nie jest poprzedzony określonymi znakami. Na przykład:

String s = "foobar barbar beachbar crowbar bar ";

Chcę dopasować, jeśli słupek nie jest poprzedzony foo. Wynik byłby więc:

barbar
beachbar
crowbar
bar

Wiem, że to prawdopodobnie bardzo proste pytanie. Próbuję się nauczyć regex, ale w międzyczasie potrzebuję teraz czegoś do pracy.

Odpowiedzi:


277

Chcesz użyć w negative lookbehindten sposób:

\w*(?<!foo)bar

Gdzie (?<!x)oznacza „tylko jeśli nie ma„ x ”przed tym punktem”.

Aby uzyskać więcej informacji, zobacz Wyrażenia regularne - Lookaround .

Edycja : dodano \w*do przechwytywania postaci wcześniej (np. „Plaża”).


2
jakie modyfikacje należy wprowadzić, aby nie pasowały do ​​elementu foo_arbitrary_bar? tj. foo nie bezpośrednio poprzedzający barek
Brad Kent

1
Wydaje mi się, (?<!foo).*barże @BradKent pasowałby do czegoś takiego.
emyller

@emyller nope. który będzie pasował do foobazbar (foo nie występuje przed foobazbar, więc pasuje)
Brad Kent

2
@BradKent Nie przeczytałem twojego „nie” w „nie pasuje”, dlatego powiedziałem, że będzie pasować. Twoja sprawa wygląda wtedy jak \b(?!foo)\w*bar\bdla mnie.
emyller

4
@BradKent Następnie możesz zadać nowe pytanie, szczegółowo omawiając to, co próbujesz osiągnąć, lub kontynuować zabawę z wyrażeniami regularnymi, aż sam to znajdziesz. :)
emyller
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.