Regex de Java: lookahead negativo

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 tiene que coincidir con uno pero no con el otro.

Las expresiones regulares que surgieron originalmente son: /foo/.+ y /foo/.+/bar/.+ respectivamente.

Creo que la segunda expresión regular está bien. Solo coincidirá con la segunda cadena. La primera expresión regular, 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 fallas en rutas como /foo/baz/crowbars que supongo que quieres que coincida 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 coincide entre w y b en "crowbar" .

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

Intereting Posts