expresión regular para hacer coincidir algo si no está precedido por otra cosa

165

Entonces, con regex en java, quiero escribir una expresión regular que coincida si y solo si el patrón no está precedido por ciertos caracteres. Por ejemplo:

String s = "foobar barbar beachbar crowbar bar ";

Quiero coincidir si la barra no está precedida por foo. Entonces la salida sería:

barbar
beachbar
crowbar
bar

Sé que esta es probablemente una pregunta muy simple. Estoy tratando de aprender expresiones regulares, pero mientras tanto necesito algo para trabajar ahora.

b3bop
fuente

Respuestas:

278

Quieres usar negative lookbehindasí:

\w*(?<!foo)bar

Donde (?<!x)significa "solo si no tiene" x "antes de este punto".

Vea Expresiones regulares - Buscar para más información.

Editar : se agregó \w*para capturar los personajes antes (por ejemplo, "playa").

Adam Rofer
fuente
2
¿Qué modificaciones se deben hacer para no coincidir con foo_arbitrary_bar? es decir, foo no precede inmediatamente al bar
Brad Kent
1
@BradKent (?<!foo).*barcoincidiría con algo así, creo.
emyller
@emyller no. eso coincidirá con foobazbar (foo no viene antes de foobazbar, por lo que coincide)
Brad Kent
2
@BradKent No leí tu "no" en "no coincide", por eso dije que coincidiría. Tu caso me parece un \b(?!foo)\w*bar\bentonces.
emyller
44
@BradKent Luego puedes hacer una nueva pregunta, elaborar lo que estás tratando de lograr en detalle, o continuar jugando con expresiones regulares hasta que la encuentres tú mismo. :)
emyller