2009-06-30 12 views
6

Mi piacerebbe abbinare tutto tranne *.xhtml. Ho un servlet che ascolta *.xhtml e voglio che un altro servlet catturi tutto il resto. Se mappo Faces Servlet su tutto (*), esplode quando si gestiscono icone, fogli di stile e tutto ciò che non è una richiesta di facce.Espressione regolare Java, corrisponde a tutto tranne

Questo è quello che ho cercato senza successo.

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

Qualche idea?

Grazie,

Walter

risposta

13

Quello che vi serve è un negative lookbehind (java example).

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

Questo schema corrisponde a tutto ciò che non termina 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."); 
    } 
    } 
} 

così:

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

Sfortunatamente, questo non funziona (testato per confermarlo); probabilmente perché l'affermazione negativa del look-ahead ha bisogno di qualcos'altro da guardare prima! –

+0

OK, quando ho postato il commento sopra, la risposta è stata modificata per un'asserzione negativa. Ma neanche questo funziona. –

+0

Sicuro, prova il codice di esempio. – rampion

7

Non expresion regolare, ma perché usare che quando non è necessario?

String page = "blah.xhtml"; 

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

È possibile utilizzare il negativo asserzione look-ahead:

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

Si prega di notare che quanto sopra corrisponde solo se l'ingresso contiene un prolungamento (.something).

+0

Anche questo sarà "an.xhtml.example.document.txt" – rampion

0

Manca solo uno "$" alla fine del pattern e un look-back negativo (che "(^())" non lo sta facendo). Guarda i costrutti speciali di the syntax.

Il modello corretto sarebbe:

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

uno strumento di test Regular Expression è prezioso in queste situazioni in cui si farebbe normalmente affidamento su persone per ricontrollare le tue espressioni per voi. Invece di scrivere il tuo, per favore usa qualcosa come RegexBuddy su Windows o Reggy su Mac OS X. Questi strumenti hanno impostazioni che ti permettono di scegliere il motore di espressioni regolari di Java (o un lavoro simile) per il test. Se è necessario testare le espressioni .NET, provare Expresso. Inoltre, è possibile utilizzare Sun's test-harness dalle loro esercitazioni, ma non è così istruttivo per formare nuove espressioni.

Problemi correlati