
Actualmente tengo una expresión regular que coincide con una cadena que contiene 'bar' pero no está precedida por 'foo':
(?<!foo)bar
Deseo modificar la expresión regular para que coincida cuando una cadena contiene 'barra' pero no está precedida por 'foo' y (opcionalmente) cualquier carácter adicional.
P.EJ. 'footestbar' no debe coincidir ya que la barra está precedida por 'foo' seguido de 'test'.
No puedo encontrar una manera de lograr esto ya que las expresiones regulares no permiten el uso de un cuantificador dentro de una búsqueda hacia atrás negativa. Posteriormente no puedo hacer lo siguiente:
(?<!foo.*)bar
¿Existe un enfoque alternativo?
ACTUALIZAR:
El sabor de la expresión regular esre2. Actualmente estoy revisando la documentación, pero a primera vista noté lo siguiente:
(?<!re) after text not matching re (NOT SUPPORTED)
Por lo tanto, la solución no puede utilizar una búsqueda hacia atrás negativa (si interpreto la documentación correctamente).
Respuesta1
Publicación modificada
Entonces, parecería que algunos (¿la mayoría?) Los motores Regex solo funcionan con una longitud fija de búsqueda hacia atrás. Sin embargo, parece correcto aceptar una anticipación de longitud variable. No estoy seguro de cuál es su caso de uso para esto o qué tan viable sería, pero una idea podría ser invertir su cadena y usar:
rab(?!.*oof)
Por supuesto, parece ridículo y no sé cómo lo usarás ni qué tan útil será. La mayor parte de mi experiencia con Regex ha sido el uso de .NET y, en su mayoría, no es necesario buscar hacia atrás. ¡Solo una idea para ti...!
Publicación original: solo funciona con ciertos motores Regex (probado con .NET)
Pruebe la siguiente expresión regular:
(?<!foo(?:.*)?)bar
Esto agrega un grupo opcional que no captura dentro de la misma mirada negativa detrás.