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.