2009-06-30 15 views
6

Ich möchte alles außer *.xhtml übereinstimmen. Ich habe ein Servlet zu hören *.xhtml und ich möchte ein anderes Servlet, um alles andere zu fangen. Wenn ich das Faces-Servlet auf alles abbilde (*), bombadiert es beim Umgang mit Icons, Stylesheets und allem, was keine Faces-Anfrage ist.Java Regular Expression, passen Sie alles außer

Dies ist, was ich erfolglos versucht habe.

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

Irgendwelche Ideen?

Danke,

Walter

Antwort

13

Was Sie brauchen, ist ein negative lookbehind (java example).

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

Dieses Muster entspricht allem, was nicht mit ".xhtml" endet.

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."); 
    } 
    } 
} 

so:

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

Leider funktioniert das nicht (getestet, um es zu bestätigen); wahrscheinlich, weil die negative Look-Ahead-Behauptung etwas anderes braucht, um vorauszusehen! –

+0

OK, zu dem Zeitpunkt, als ich den obigen Kommentar gepostet habe, wurde die Antwort zu einer negativen Rückschau-Behauptung editiert. Aber das funktioniert auch nicht. –

+0

Sicher ist es - versuchen Sie den Beispielcode. – rampion

7

Nicht regelmäßig expresion, aber warum verwenden, wenn Sie nicht zu tun haben?

String page = "blah.xhtml"; 

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

Sie können die negative Vorgriff Behauptung verwenden:

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

Bitte beachten Sie, dass die oben paßt nur, wenn der Eingang eine Erweiterung enthält (.something).

+0

Dies wird auch "an.xhtml.example.document.txt" durchgehen – rampion

0

Sie sind wirklich nur ein "$" am Ende Ihres Musters und ein guter negativer Look-Behind (das "" macht das nicht). Schauen Sie sich die speziellen Konstrukte Teil von the syntax an.

Das wäre richtig Muster sein:

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

A Regular Expression-Test-Tool in diesen Situationen von unschätzbarem Wert ist, wenn Sie in der Regel auf Menschen verlassen würden, damit Sie Ihre Ausdrücke zu verdoppeln überprüfen. Anstatt eigene Dateien zu schreiben, verwenden Sie bitte eine Datei wie RegexBuddy unter Windows oder Reggy unter Mac OS X. Diese Tools enthalten Einstellungen, mit denen Sie die Java-Engine für reguläre Ausdrücke (oder eine ähnliche Anwendung) zum Testen auswählen können. Wenn Sie .NET-Ausdrücke testen müssen, versuchen Sie Expresso. Sie könnten auch Suns test-harness aus ihren Tutorials verwenden, aber es ist nicht so lehrreich für die Bildung neuer Ausdrücke.