solo regulares regular probar palabra numeros matches letras extraer expresiones expresion exacta espacio ejemplo con cadenas blanco alfanumerico java regex clojure

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