2012-01-25 29 views
6

Tôi chắc chắn điều này phải đủ dễ dàng, nhưng tôi đang gặp khó khăn ...filename trận đấu và phần mở rộng tập tin từ đơn Regex

var regexFileName = /[^\\]*$/; // match filename 
var regexFileExtension = /(\w+)$/; // match file extension 

function displayUpload() { 
    var path = $el.val(); //This is a file input 
    var filename = path.match(regexFileName); // returns file name 
    var extension = filename[0].match(regexFileExtension); // returns extension 

    console.log("The filename is " + filename[0]); 
    console.log("The extension is " + extension[0]); 
} 

Chức năng trên hoạt động tốt, nhưng tôi chắc chắn nó phải là có thể đạt được với một regex đơn, bằng cách tham khảo các phần khác nhau của mảng được trả về bằng phương thức .match(). Tôi đã thử kết hợp các regex nhưng không thành công.

Ngoài ra, tôi không sử dụng một chuỗi thử nghiệm nó trên trong ví dụ, như console.log() thoát khỏi sự backslashes trong một filepath và nó đã bắt đầu để gây nhầm lẫn cho tôi :)

Trả lời

5

Giả sử rằng tất cả các file không có một phần mở rộng, bạn có thể sử dụng

var regexAll = /[^\\]*\.(\w+)$/; 

Sau đó, bạn có thể làm

var total = path.match(regexAll); 
var filename = total[0]; 
var extension = total[1]; 
+0

tôi nhiều hơn một chàng trai .net regex nhưng không bạn thiếu nhóm chụp đầu tiên? – rtpHarry

+0

@rtpHarry: Toàn bộ trận đấu (nhóm 0) là tên tệp (bao gồm cả phần mở rộng), nhóm chụp đầu tiên (nhóm 1) là phần mở rộng. –

+0

Anh ta cần tên tệp, chứ không phải toàn bộ đường dẫn. – shift66

6

/^.*\/(.*)\.?(.*)$/g sau đầu tiên này nhóm là tên tệp của bạn và nhóm thứ hai được gia hạn.

var myString = "filePath/long/path/myfile.even.with.dotes.TXT"; 
var myRegexp = /^.*\/(.*)\.(.*)$/g; 
var match = myRegexp.exec(myString); 
alert(match[1]); // myfile.even.with.dotes 
alert(match[2]); // TXT 

Điều này hoạt động ngay cả khi tên tệp của bạn chứa nhiều hơn một dấu chấm hoặc không chứa dấu chấm (không có giới hạn).
EDIT:
này là dành cho Linux, cho các cửa sổ sử dụng này /^.*\\(.*)\.?(.*)$/g (trong linux phân cách thư mục là / trong cửa sổ là \)

+0

này không thành công với ' '/ tmp/myFile.txt'' – DelightedD0D

2

bạn có thể sử dụng các nhóm trong yo biểu thức chính quy của ur cho điều này:

var regex = /^([^\\]*)\.(\w+)$/; 
var matches = filename.match(regex); 

if (matches) { 
    var filename = matches[1]; 
    var extension = matches[2]; 
} 
+0

Tôi là một anh chàng regex .net nhưng không phải là bạn bị mất nhóm chụp đầu tiên? – rtpHarry

+0

Bạn nói đúng. Tôi chỉ thử nghiệm nó, tài liệu có một chút bối rối về nó: P – fivedigit

+0

Mã của bạn đã chính xác trước đây và bây giờ đã bị hỏng. 'Các trận đấu [2]' phải đến từ đâu nếu bạn chỉ có một nhóm bắt giữ? –

0

Tôi nghĩ đây là cách tiếp cận tốt hơn chỉ khớp với thư mục, tên tệp và tiện ích mở rộng hợp lệ. và cũng nhóm các đường dẫn, tên tệp và phần mở rộng tệp. Và cũng làm việc với đường dẫn trống chỉ tên tập tin.

^([\w\/]*?)([\w\.]*)\.(\w)$ 

trường hợp thử nghiệm

the/p0090Aath/fav.min.icon.png 
the/p0090Aath/fav.min.icon.html 
the/p009_0Aath/fav.m45in.icon.css 
fav.m45in.icon.css 
favicon.ico 

Output

[the/p0090Aath/][fav.min.icon][png] 
[the/p0090Aath/][fav.min.icon][html] 
[the/p009_0Aath/][fav.m45in.icon][css] 
[][fav.m45in.icon][css] 
[][favicon][ico] 
2

này sẽ nhận ra thậm chí /home/someUser/.aaa/.bb.c:

function splitPathFileExtension(path){ 
    var parsed = path.match(/^(.*\/)(.*)\.(.*)$/); 
    return [parsed[1], parsed[2], parsed[3]]; 
} 
0

Tôi biết đây là một câu hỏi cũ, nhưng đây là một giải pháp khác mà có thể xử lý nhiều dấu chấm trong tên và cũng có khi không có phần mở rộng ở tất cả (hoặc một phần mở rộng của chỉ ''):
/^(.*?)(\.[^.]*)?$/

Lấy nó một mảnh tại một thời điểm:
^
Neo khi bắt đầu của chuỗi (để tránh các trận đấu một phần)

(.*?)
trận đấu bất kỳ ký tự ., 0 hoặc nhiều lần *, uể oải ? (không chỉ cần lấy tất cả chúng nếu phần mở rộng tùy chọn sau này có thể phù hợp), và đặt chúng trong nhóm chụp đầu tiên ().

(\.
Bắt đầu nhóm chụp thứ hai cho tiện ích mở rộng bằng cách sử dụng (. Nhóm này bắt đầu bằng ký tự chữ số . (mà chúng tôi thoát với \ để . không được hiểu là "khớp với bất kỳ ký tự nào").

[^.]*
Xác định bộ ký tự []. Khớp các ký tự không trong bộ bằng cách chỉ định đây là bộ ký tự đảo ngược ^. Đối sánh 0 hoặc nhiều hơn không phải . ký tự để tải phần còn lại của phần mở rộng tệp *. Chúng tôi chỉ định theo cách này để nó không khớp sớm với tên tệp như foo.bar.baz, cung cấp tiện ích mở rộng không chính xác với nhiều hơn một dấu chấm trong đó là .bar.baz thay vì chỉ .baz. . không cần phải thoát bên trong [], vì mọi thứ (trừ ^) là một chữ trong bộ ký tự.

)?
End nhóm chụp 2 ) và chỉ ra rằng cả nhóm là tùy chọn ?, vì nó có thể không có phần mở rộng.

$
Neo đến cuối chuỗi (một lần nữa, để tránh các trận đấu một phần)

Nếu bạn đang sử dụng ES6 bạn thậm chí có thể sử dụng huỷ để lấy kết quả trong 1 dòng:
[,filename, extension] = /^(.*?)(\.[^.]*)?$/.exec('foo.bar.baz'); mà cung cấp tên tệp là 'foo.bar' và phần mở rộng là '.baz'.
'foo' cho 'foo' and ''
'foo.' cho 'foo''.'
'.js' cho '''.js'

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