Necesito una expresión regular que coincida blahfooblahpero noblahfoobarblah
Quiero que coincida solo con foo y todo lo que hay alrededor de foo, siempre que no vaya seguido de barra.
Intenté usar esto: foo.*(?<!bar)que está bastante cerca, pero coincide blahfoobarblah. La mirada negativa detrás debe coincidir con cualquier cosa y no solo con barra.
El lenguaje específico que estoy usando es Clojure, que usa expresiones regulares de Java bajo el capó.
EDITAR: Más específicamente, también necesito que pase, blahfooblahfoobarblahpero no blahfoobarblahblah.

Respuestas:
Tratar:
Pruebas:
Explicación de expresiones regulares
Otras expresiones regulares
Si solo desea excluir
barcuando es directamente despuésfoo, puede usarEditar
Actualizó su pregunta para que sea más específica.
Nuevas pruebas
Nueva explicación
(?=.*foo(?!bar))asegura quefoose encuentre pero no se siga directamentebarfuente
foopero nofoobar. Para igualarbotpero nobotters, usaría/(?=.*bot(?!ters))^(\w+)$/.Para hacer coincidir un
fooseguimiento con algo que no comience conbar, intenteSu versión con lookbehind negativo es efectivamente "coincidir con un
fooseguido de algo que no termina enbar". Los.*partidos de todosbarblah, y los(?<!bar)vuelve a mirarlahy comprueba que no se correspondebar, que no lo hace, así que todo el patrón de coincidencias.fuente
En su lugar, utilice una mirada negativa hacia el futuro:
Esto funcionó para mí, espero que ayude. ¡Buena suerte!
fuente
Escribiste un comentario sugiriendo que te gusta que esto funcione haciendo coincidir todas las palabras en una cadena en lugar de toda la cadena en sí.
En lugar de mezclar todo esto en un comentario, lo publico como una nueva respuesta.
Nueva expresión regular
Texto de ejemplo
Partidos
fuente
Su solicitud de coincidencia específica puede coincidir con:
Esto coincidirá
blahfooblahfoobarblahpero noblahfoobarblahblah.El problema con la expresión regular de
foo.*(?<!bar)es el.*despuésfoo. Coincide con la mayor cantidad de caracteres, incluidos los personajes posterioresbar.fuente