2009-06-30 28 views
6

Me gustaría hacer coincidir todo excepto *.xhtml. Tengo un servlet escuchando *.xhtml y quiero que otro servlet capte todo lo demás. Si asigno el Servlet de Caras a todo (*), se dispara cuando se manejan iconos, hojas de estilo y todo lo que no es una solicitud de caras.Expresión regular de Java, coincida con todo menos

Esto es lo que he estado intentando sin éxito.

Pattern inverseFacesUrlPattern = Pattern.compile(".*(^(\\.xhtml))"); 

¿Alguna idea?

Gracias,

Walter

Respuesta

13

Lo que necesita es un negative lookbehind (java example).

String regex = ".*(?<!\\.xhtml)$"; 
Pattern pattern = Pattern.compile(regex); 

Este patrón coincide con cualquier cosa que no termine con ".xhtml".

import java.util.regex.Matcher; 
import java.util.regex.Pattern; 

public class NegativeLookbehindExample { 
    public static void main(String args[]) throws Exception { 
    String regex = ".*(?<!\\.xhtml)$"; 
    Pattern pattern = Pattern.compile(regex); 

    String[] examples = { 
     "example.dot", 
     "example.xhtml", 
     "example.xhtml.thingy" 
    }; 

    for (String ex : examples) { 
     Matcher matcher = pattern.matcher(ex); 
     System.out.println("\""+ ex + "\" is " + (matcher.find() ? "" : "NOT ") + "a match."); 
    } 
    } 
} 

manera:

% javac NegativeLookbehindExample.java && java NegativeLookbehindExample                                   
"example.dot" is a match. 
"example.xhtml" is NOT a match. 
"example.xhtml.thingy" is a match. 
+0

Lamentablemente, esto no funciona (probado para confirmarlo); ¡probablemente porque la afirmación de mirar hacia adelante negativa necesita algo más que mirar antes! –

+0

OK, para el momento en que publiqué el comentario anterior, la respuesta fue editada en una afirmación negativa de mirar hacia atrás. Pero esto tampoco funciona. –

+0

Claro que sí - prueba el código de muestra. – rampion

7

No expresion regular, pero ¿por qué utilizar que cuando usted no tiene que?

String page = "blah.xhtml"; 

if(page.endsWith(".xhtml")) 
{ 
    // is a .xhtml page match 
}  
0

Usted podría utilizar la afirmación de preanálisis negativo:

Pattern inverseFacesUrlPattern = Pattern.compile("^.*\\.(?!xhtml).*$"); 

Tenga en cuenta que el anterior sólo si coincide con la entrada contiene una extensión (.something).

+0

Esto también suspenderá "an.xhtml.example.document.txt" – rampion

0

Solo faltará un "$" al final de su patrón y un aspecto negativo negativo (que "(^())" no está haciendo eso). Mire constructos especiales parte de the syntax.

El patrón correcto sería:

.*(?<!\.xhtml)$ 
    ^^^^-------^ This is a negative look-behind group. 

Una herramienta de prueba de expresiones regulares es muy valioso en estas situaciones en las que normalmente se basan en la gente que vuelva a comprobar sus expresiones para usted. En lugar de escribir el suyo, use algo como RegexBuddy en Windows o Reggy en Mac OS X. Estas herramientas tienen configuraciones que le permiten elegir el motor de expresiones regulares de Java (o un trabajo similar) para probar. Si necesita probar expresiones .NET, intente Expresso. Además, puedes usar el test-harness de Sun desde sus tutoriales, pero no es tan instructivo para formar nuevas expresiones.

Cuestiones relacionadas