2016-08-17 5 views
-2

В приложении Java, мне нужно написать String, содержащую регулярное выражение для URI, так что URI не содержит последовательности символов, как .js?, .css? и .jpg?, но и не заканчивая .js, .css и .jpgRegex для сопоставления строки не заканчивается или содержащие расширения файлов

Я сделал следующее:

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

Которые в основном соответствует всем URI, оканчивающиеся с заданными расширениями файлов или содержащие расширение файла плюс Цюй знак эстиона.

Как я могу отрицать предыдущие условия?

Так, например, я ожидаю, что следующий URI будет соответствовать

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

но и следующие будут не

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

Вы пытаетесь соответствовать недействительных URL, или действительным URL-адрес? – shmosel

+1

Вы должны использовать класс URI для извлечения пути до: http://download.java.net/jdk7/archive/b123/docs/api/java/net/URI.html –

+1

@CasimiretHippolyte Я не могу. См. Мой комментарий к принятому ответу. Я использую его в аннотации Spring, чтобы отфильтровать местозаполнитель. –

ответ

4

Используйте два чередований в негативном взгляде вперед:

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

Это регулярное выражение соответствует действительный вход. В Java:

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

Если вы хотите, чтобы соответствовать недействительно входу, использовать положительный взгляд вперед:

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

Отлично! Я использую его в сочетании с этим [ответом] (http://stackoverflow.com/a/37578136/1983997) о том, как использовать заполнители в контроллерах Spring –

1

Если вы пытаетесь матча недействительные адреса, это должно сделать это:

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)); 

Выход:

true 
true 
false 
+0

Я хотел бы соответствовать, если URL-адрес действителен, поэтому, к примеру, он не заканчивается на .css или не содержит .css? –