2011-07-05 12 views
22

Poniżej regexJavaScript regex rozszerzenia dopasowywania plików/wydobywania

var patt1=/[0-9a-z]+$/i; 

wydobywa rozszerzenie pliku ciągów takich jak

filename-jpg 
filename#gif 
filename.png 

Jak zmodyfikować tego wyrażenia regularnego, aby zwrócić tylko rozszerzenie gdy ciąg naprawdę to nazwa pliku z jedną kropką jako separatorem? (Oczywiście nazwa pliku # gif nie jest zwykłą nazwą pliku)

AKTUALIZACJA Na podstawie komentarzy Tvanofsson chciałbym wyjaśnić, że gdy funkcja JS odbiera ciąg znaków, ciąg znaków będzie już zawierał nazwę pliku bez spacji bez kropek i innych znaków specjalnych znaków (w rzeczywistości będzie obsługiwany jako slug). Problem polegał nie na parsowaniu nazw plików, ale na niewłaściwym analizowaniu wtyczek - funkcja zwracała rozszerzenie "jpg", gdy podano "filename-jpg", kiedy powinien naprawdę powrócić null lub pusty ciąg znaków i to jest to zachowanie, które musiało być poprawione.

+3

Czy wyrażenie regularne musi określać, czy nazwa pliku jest poprawną nazwą pliku? Co definiuje legalną nazwę pliku? Co definiuje prawne rozszerzenie pliku? Na przykład jest 'foo bar.zi_' jest legalną nazwą pliku? Co powiesz na 'foo.bar.zi_'? – tvanfosson

+0

Typowa nazwa pliku systemu operacyjnego. Twój przykład z zawartością w nim nie może się zdarzyć w naszym systemie, a odpowiedź udzielona przez @stema wydaje się działać z podwójnymi rozszerzeniami, więc jest wystarczająco dobra dla mnie. – mare

+1

Oba przykłady są legalnymi nazwami plików w systemach Unix i Windows. Twoje pytanie może zostać poprawione poprzez dokładne wyszczególnienie tego, co uważasz za legalną nazwę pliku. To sprawi, że odpowiedzi, szczególnie. zaakceptowana odpowiedź ma większe znaczenie dla przyszłych czytelników, którzy mogą chcieć rozwiązać ten sam lub podobny problem. – tvanfosson

Odpowiedz

44

Wystarczy dodać . do regex

var patt1=/\.[0-9a-z]+$/i; 

Ponieważ kropka jest znakiem specjalnym w regex trzeba uciec, aby dopasować go dosłownie: \..

Twój wzór będzie teraz pasował do dowolnego ciągu, który kończy się kropką, a następnie co najmniej jednym znakiem z [0-9a-z].

np.

foobar.a
foobar.txt
foobar.foobar1234

jeśli chcesz ograniczyć rozszerzenie pewnej ilości znaków również, niż trzeba wymienić +

var patt1=/\.[0-9a-z]{1,5}$/i; 

pozwoli na co najmniej 1 i co najwyżej 5 znaków po kropce.

+0

co zrobić, jeśli nie potrzebuję kropki w moim meczu i tylko przedłużeniu? – user2727195

+0

@ user2727195 Bez kropki nie pasujesz do rozszerzenia. Jeśli masz na myśli ... jak używać tylko tekstu wynikowego, możesz użyć podciągu, jak: '((" file.ext "). Match (patt1) || '') .substring (1);' – Armstrongest

34

Spróbuj

var patt1 = /\.([0-9a-z]+)(?:[\?#]|$)/i; 

RegExp ta jest przydatna do wydobywania rozszerzeń plików z adresów URL - nawet te, które mają ?foo=1 ciągów zapytania i #hash zakończeń.

Dostarczy również rozszerzenie o numer $1.

var m1 = ("filename-jpg").match(patt1); 
alert(m1); // null 

var m2 = ("filename#gif").match(patt1); 
alert(m2); // null 

var m3 = ("filename.png").match(patt1); 
alert(m3); // [".png", "png"] 

var m4 = ("filename.txt?foo=1").match(patt1); 
alert(m4); // [".txt?", "txt"] 

var m5 = ("filename.html#hash").match(patt1); 
alert(m5); // [".html#", "html"] 

PS: +1 dla @stema who offers pretty good advice o niektórych podstawach składniowych RegExp zaangażowanych.

+0

Dzięki stary :-) – ianaz

7

Przykładowa lista:

var fileExtensionPattern = /\.([0-9a-z]+)(?=[?#])|(\.)(?:[\w]+)$/gmi 
//regex flags -- Global, Multiline, Insensitive 

var ma1 = 'css/global.css?v=1.2'.match(fileExtensionPattern)[0]; 
console.log(ma1); 
// returns .css 

var ma2 = 'index.html?a=param'.match(fileExtensionPattern)[0]; 
console.log(ma2); 
// returns .html 

var ma3 = 'default.aspx?'.match(fileExtensionPattern)[0]; 
console.log(ma3); 
// returns .aspx 

var ma4 = 'pages.jsp#firstTab'.match(fileExtensionPattern)[0]; 
console.log(ma4); 
// returns .jsp 

var ma5 = 'jquery.min.js'.match(fileExtensionPattern)[0]; 
console.log(ma5); 
// returns .js 

var ma6 = 'file.123'.match(fileExtensionPattern)[0]; 
console.log(ma6); 
// returns .123 

Test page.

Powiązane problemy