regex para corresponder algo se não for precedido por outra coisa

165

Portanto, com regex em java, quero escrever um regex que corresponda se e somente se o padrão não for precedido por determinados caracteres. Por exemplo:

String s = "foobar barbar beachbar crowbar bar ";

Quero corresponder se a barra não for precedida por foo. Portanto, a saída seria:

barbar
beachbar
crowbar
bar

Eu sei que essa é provavelmente uma pergunta muito simples. Estou tentando aprender regex, mas, enquanto isso, preciso de algo para trabalhar agora.

b3bop
fonte

Respostas:

278

Você deseja usar negative lookbehindassim:

\w*(?<!foo)bar

Onde (?<!x)significa "somente se não tiver" x "antes deste ponto".

Consulte Expressões regulares - pesquisa para obter mais informações.

Editar : adicionado \w*para capturar os personagens antes (por exemplo, "praia").

Adam Rofer
fonte
2
que modificações precisam ser feitas para não coincidir com foo_arbitrary_bar? ie foo bar não imediatamente anterior
Brad Kent
1
@ BradKent (?<!foo).*barcorresponderia a algo assim, eu acredito.
Emyller 17/07/19
@emyller nope. que irá corresponder foobazbar (foo não vem antes foobazbar, para que coincida)
Brad Kent
2
@ BradKent Eu não li o seu "não" em "não corresponde", por isso disse que corresponderia. Seu caso parece um \b(?!foo)\w*bar\bpara mim então.
Emilitar
4
@BradKent Então você pode fazer uma nova pergunta, elaborando o que você está tentando alcançar em detalhes, ou continuar jogando com expressões regulares até encontrá-la. :)
emyller