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.

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").


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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.