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.