regulares - matches java ejemplo
Una expresión regular para hacer coincidir una subcadena que no es seguida por otra subcadena determinada (5)
Tratar:
/(?!.*bar)(?=.*foo)^(/w+)$/
Pruebas:
blahfooblah # pass
blahfooblahbarfail # fail
somethingfoo # pass
shouldbarfooshouldfail # fail
barfoofail # fail
Explicación de expresión regular
NODE EXPLANATION
--------------------------------------------------------------------------------
(?! look ahead to see if there is not:
--------------------------------------------------------------------------------
.* any character except /n (0 or more times
(matching the most amount possible))
--------------------------------------------------------------------------------
bar ''bar''
--------------------------------------------------------------------------------
) end of look-ahead
--------------------------------------------------------------------------------
(?= look ahead to see if there is:
--------------------------------------------------------------------------------
.* any character except /n (0 or more times
(matching the most amount possible))
--------------------------------------------------------------------------------
foo ''foo''
--------------------------------------------------------------------------------
) end of look-ahead
--------------------------------------------------------------------------------
^ the beginning of the string
--------------------------------------------------------------------------------
( group and capture to /1:
--------------------------------------------------------------------------------
/w+ word characters (a-z, A-Z, 0-9, _) (1 or
more times (matching the most amount
possible))
--------------------------------------------------------------------------------
) end of /1
--------------------------------------------------------------------------------
$ before an optional /n, and the end of the
string
Otra expresión regular
Si solo quiere excluir la bar
cuando está directamente después de foo
, puede usar
/(?!.*foobar)(?=.*foo)^(/w+)$/
Editar
Hiciste una actualización de tu pregunta para que sea específica.
/(?=.*foo(?!bar))^(/w+)$/
Nuevas pruebas
fooshouldbarpass # pass
butnotfoobarfail # fail
fooshouldpassevenwithfoobar # pass
nofuuhere # fail
Nueva explicación
(?=.*foo(?!bar))
asegura que se encuentra un foo
pero no se sigue directamente la bar
Necesito una expresión regular que coincida con blahfooblah
pero no blahfoobarblah
Quiero que coincida solo con foo y todo lo que rodea a foo, siempre que no esté seguido por la barra.
Intenté usar esto: foo.*(?<!bar)
que está bastante cerca, pero coincide con blahfoobarblah
. El aspecto negativo detrás debe coincidir con cualquier cosa y no solo con la 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 blahfooblahfoobarblah
pero no blahfoobarblahblah
.
Para hacer coincidir un foo
siguiendo por algo que no comienza con la bar
, prueba
foo(?!bar)
Su versión con lookbehind negativo es efectivamente "match a foo
seguido de algo que no termina en la bar
". El .*
barblah
con todos los barblah
, y el (?<!bar)
mira hacia atrás a lah
y comprueba que no coincide con la bar
, lo que no ocurre, por lo que todo el patrón coincide.
Su solicitud de coincidencia específica puede coincidir con:
/w+foo(?!bar)/w+
Esto coincidirá con blahfooblahfoobarblah
pero no con blahfoobarblahblah
.
El problema con tu expresión regular de foo.*(?<!bar)
es el .*
foo
. Coincide con la mayoría de los caracteres, incluidos los caracteres después de la bar
.
Use una mirada negativa hacia adelante en su lugar:
/s*(?!/w*(bar)/w*)/w*(foo)/w*/s*
Esto funcionó para mí, espero que ayude. ¡Buena suerte!
Usted escribió un comentario sugiriendo que le gusta esto para trabajar haciendo coincidir todas las palabras en una cadena en lugar de la cadena entera.
En lugar de aplastar todo esto en un comentario, lo estoy publicando como una nueva respuesta.
Nueva Regex
/(?=/w*foo(?!bar))(/w+)/
Texto de ejemplo
foowithbar fooevenwithfoobar notfoobar foohere notfoobarhere perofooisokherebarforefoobarhere andnofuu needsfoo
Partidos
foowithbar fooevenwithfoobar foohere perofooisokhere bars needsfoo