pattern online not negative literal exist example does containing java regex negative-lookahead regex-lookarounds

online - Expresiones regulares de Java: lookahead negativo



regex online (1)

Estoy tratando de crear dos expresiones regulares que coincidan con los URI. Estos URI tienen el formato: /foo/someVariableData y /foo/someVariableData/bar/someOtherVariableData

Necesito dos expresiones regulares. Cada uno debe coincidir con uno pero no el otro.

Los regexes que se me ocurrieron originalmente son: /foo/.+ y /foo/.+/bar/.+ respectivamente.

Creo que el segundo regex está bien. Sólo coincidirá con la segunda cadena. El primer regex, sin embargo, coincide con ambos. Entonces, comencé a jugar (por primera vez) con lookahead negativo. /foo/.+(?!bar) la expresión regular /foo/.+(?!bar) y configuré el siguiente código para probarlo

public static void main(String[] args) { String shouldWork = "/foo/abc123doremi"; String shouldntWork = "/foo/abc123doremi/bar/def456fasola"; String regex = "/foo/.+(?!bar)"; System.out.println("ShouldWork: " + shouldWork.matches(regex)); System.out.println("ShouldntWork: " + shouldntWork.matches(regex)); }

Y, por supuesto, ambos resuelven a la true .

¿Alguien sabe lo que estoy haciendo mal? No necesito usar Mirada Negativa necesariamente, solo necesito resolver el problema, y ​​creo que la Mirada Negativa podría ser una forma de hacerlo.

Gracias,


Tratar

String regex = "/foo/(?!.*bar).+";

o posiblemente

String regex = "/foo/(?!.*//bbar//b).+";

para evitar fallos en rutas como /foo/baz/crowbars que supongo que quieres que coincidan con la expresión regular.

Explicación: (sin las dobles barras invertidas requeridas por las cadenas Java)

/foo/ # Match "/foo/" (?! # Assert that it''s impossible to match the following regex here: .* # any number of characters /b # followed by a word boundary bar # followed by "bar" /b # followed by a word boundary. ) # End of lookahead assertion .+ # Match one or more characters

/b , el "anclaje de límite de palabra", coincide con el espacio vacío entre un carácter alfanumérico y un carácter no alfanumérico (o entre el inicio / final de la cadena y un carácter de alúmina). Por lo tanto, coincide antes de la b o después de la r en "bar" , pero no puede coincidir entre w y b en "crowbar" .

Protip: Eche un vistazo a http://www.regular-expressions.info - un excelente tutorial de expresiones regulares.