2016-08-17 1 views
-2

In einer Java-Anwendung endet oder mit einem Gehalt, ich brauche für URIs, eine String enthält einen regulären Ausdruck zu schreiben, so dass der URI enthält keine Zeichenfolgen wie .js?, .css? und .jpg?, sind aber auch nicht endend mit .js, .css und .jpgRegex für passende String nicht Dateierweiterungen

ich habe folgende:

(?:.js|.css|.jpg)$|(?:.js[?]|.html[?]|.jpg[?]) 

, die alle die Endung URIs mit den angegebenen Dateierweiterungen enthalten oder die Dateierweiterung und die qu im Grunde übereinstimmt Estionsmarke.

Wie kann ich die Negation der und der vorherigen Bedingungen tun?

So zum Beispiel erwarte ich, dass die folgende URI

"https://stackoverflow.com/a/fancy/uri/.js/which/is/valid" 

entsprechen, werden aber die beiden folgenden wird

nicht
"https://stackoverflow.com/a/fancy/uri/which/is/invalid.js" 
"https://stackoverflow.com/a/fancy/uri/which/is/invalid.js?ver=1" 
+0

Versuchen Sie, ungültige URLs oder gültige URLs übereinstimmen? – shmosel

+1

Sie sollten die URI-Klasse verwenden, um den Pfad zuvor zu extrahieren: http://download.java.net/jdk7/archive/b123/docs/api/java/net/URI.html –

+1

@CasimiretHippolyte kann ich nicht. Siehe meinen Kommentar zur akzeptierten Antwort. Ich verwende es in einer Spring Annotation, um einen Platzhalter zu filtern. –

Antwort

4

Verwenden Sie zwei Abwechslungen in einem negativen Vorgriff:

^(?!.*\.(js|css|jpg)($|\?)).* 

Diese Regex entspricht gültig Eingang. In Java:

if (url.matches("^(?!.*\\.(js|css|jpg)($|\\?)).*") 
    // url is OK 

Wenn Sie ungültig Eingabe übereinstimmen, verwenden Sie einen positiven Blick in die Zukunft:

if (url.matches("^(?=.*\\.(js|css|jpg)($|\\?)).*") 
    // url is not OK 
+1

Perfekt! Ich verwende es in Kombination mit dieser [Antwort] (http://stackoverflow.com/a/37578136/1983997) zur Verwendung von Platzhaltern in Spring-Controllern –

1

Wenn Sie Match ungültig URLs versuchen, dies sollte es tun:

String regex = ".*\\.(js|css|jpg)($|\\?.*)"; 
System.out.println("https://stackoverflow.com/a/fancy/uri/which/is/invalid.js?ver=1".matches(regex)); 
System.out.println("https://stackoverflow.com/a/fancy/uri/which/is/invalid.js".matches(regex)); 
System.out.println("https://stackoverflow.com/a/fancy/uri/.js/which/is/valid".matches(regex)); 

Ausgang:

true 
true 
false 
+0

Ich würde gerne übereinstimmen, wenn die URL gültig ist, also zum Beispiel nicht mit .css endet oder .css nicht enthalten muss? –