2011-07-05 39 views
22

Sau đây regexjavascript regex gia hạn hợp/giải nén tập tin

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

chiết xuất phần mở rộng tập tin của chuỗi như

filename-jpg 
filename#gif 
filename.png 

Làm thế nào để sửa đổi biểu thức chính quy này để chỉ trả lại một phần mở rộng khi chuỗi thực sự tên tệp có dấu chấm là dấu phân tách là gì? (Rõ ràng tên tệp # gif không phải là tên tệp thông thường)

CẬP NHẬT Dựa trên nhận xét của tvanofsson Tôi muốn làm rõ rằng khi hàm JS nhận chuỗi, chuỗi sẽ chứa tên tệp mà không có dấu chấm và đặc biệt khác ký tự (nó sẽ thực sự được xử lý một slug). Vấn đề không phải là phân tích cú pháp tên tập tin mà trong phân tích cú pháp không chính xác - hàm trả về phần mở rộng của "jpg" khi nó được đưa ra "filename-jpg" khi nó thực sự trả về null hoặc chuỗi rỗng và hành vi này cần thiết sửa chữa.

+3

Regex có phải xác định xem tên tệp có phải là tên tệp hợp pháp không? Điều gì định nghĩa tên tệp hợp pháp? Điều gì định nghĩa một phần mở rộng tên tập tin pháp lý? Ví dụ, là 'foo bar.zi_' tên tệp hợp pháp? Làm thế nào về 'foo.bar.zi_'? – tvanfosson

+0

Tên tệp hệ điều hành điển hình..ví dụ của bạn với không gian trong nó không thể xảy ra trong hệ thống của chúng tôi và câu trả lời được cung cấp bởi @stema dường như hoạt động với các phần mở rộng đôi nên nó đủ tốt cho tôi. – mare

+1

Cả hai ví dụ đều là tên tệp hợp pháp trong Unix và Windows. Câu hỏi của bạn có thể được cải thiện bằng cách nêu chi tiết chính xác những gì bạn cho là tên tệp hợp pháp. Nó sẽ làm cho câu trả lời, đặc biệt. câu trả lời được chấp nhận có ý nghĩa hơn đối với người đọc trong tương lai, những người có thể đang tìm cách giải quyết cùng một vấn đề hoặc tương tự. – tvanfosson

Trả lời

44

Chỉ cần thêm một . để regex

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

Bởi vì dấu chấm là một nhân vật đặc biệt trong regex bạn cần phải thoát khỏi nó để phù hợp với nó theo nghĩa đen: \..

Mẫu của bạn bây giờ sẽ khớp với bất kỳ chuỗi nào kết thúc bằng dấu chấm, sau đó là ít nhất một ký tự từ [0-9a-z].

ví dụ:

foobar.a
foobar.txt
foobar.foobar1234

nếu bạn muốn giới hạn các phần mở rộng cho một số tiền nhất định của các nhân vật cũng có, hơn bạn cần phải thay thế +

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

sẽ cho phép ít nhất 1 và tối đa 5 ký tự sau dấu chấm.

+0

nếu tôi không cần dấu chấm trong kết hợp của mình và chỉ là tiện ích mở rộng? – user2727195

+0

@ user2727195 Không có dấu chấm, bạn không khớp với tiện ích. Nếu bạn có nghĩa là ... làm thế nào để bạn chỉ sử dụng văn bản kết quả, sau đó bạn có thể sử dụng chuỗi con, như vậy: '((" file.ext "). Match (patt1) || '') .substring (1);' – Armstrongest

34

Hãy thử

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

RegExp này rất hữu ích cho việc trích xuất các phần mở rộng tập tin từ các URL - ngay cả những người mà có ?foo=1 chuỗi truy vấn và #hash kết thúc.

Nó cũng sẽ cung cấp cho bạn phần mở rộng là $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"] 

P.S. +1 cho @stema người offers pretty good advice trên một số khái niệm cơ bản về cú pháp RegExp có liên quan.

+0

Cảm ơn dude :-) – ianaz

7

danh sách Ví dụ:

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.

Các vấn đề liên quan