2012-02-20 42 views
12

tôi cần phải giải nén chỉ là tên tập tin (không mở rộng tập tin) từ đường dẫn sau ....Regex để trích xuất tên tập tin từ đường dẫn

\\my-local-server\path\to\this_file may_contain-any&character.pdf

Tôi đã thử một vài điều, dựa hầu hết tắt của cái gì đó như http://regexr.com?302m5 nhưng không thể đạt được điều đó khá

+3

Ngôn ngữ nào? Một số ngôn ngữ có phương pháp phân tích các URI trong thư viện chuẩn của chúng. –

+0

'. * \\ (. +?) \. Pdf' – kev

+2

Tôi hoài nghi một regex sẽ nhanh hơn việc lấy chỉ mục của dấu phân cách đường dẫn cuối cùng, nhưng tôi có thể sai. –

Trả lời

21
^\\(.+\\)*(.+)\.(.+)$ 

regex này đã được thử nghiệm trên hai ví dụ sau:

\ var \ www \ www.example.com \ index.php
\ index.php

khối đầu tiên "(. + \) *" Phù hợp với đường dẫn thư mục.
Chặn thứ hai "(. +)" Khớp với tên tệp mà không có phần mở rộng.
Chặn thứ ba "(. +) $" Khớp với tiện ích mở rộng.

4

Hãy thử this:

[^\\]+(?=\.pdf$) 

Nó phù hợp với tất cả mọi thứ trừ dấu gạch chéo ngược theo sau là .pdf ở cuối chuỗi.

Bạn cũng có thể (và có lẽ nó thậm chí còn tốt hơn) lấy phần bạn muốn vào nhóm chụp như thế:

([^\\]+)\.pdf$ 

Nhưng làm thế nào bạn giới thiệu vào nhóm này (phần trong ngoặc) phụ thuộc vào ngôn ngữ hoặc regexp hương vị bạn đang sử dụng. Trong hầu hết các trường hợp, nó sẽ có màu như $1 hoặc \1 hoặc thư viện sẽ cung cấp một số phương pháp để thu thập nhóm theo số sau khi kết hợp regexp.

+0

Nếu nó giống như: '[^ \\] (. +) \. Pdf $' – macduff

+0

@macduff câu hỏi cũng là đường dẫn hoặc chỉ tên tệp ..? – noob

+0

Tôi hiểu nó là tên tệp, nhưng không phải là phần mở rộng hoặc đường dẫn, xin lỗi nếu tôi hiểu lầm. – macduff

6

Thao tác này sẽ lấy tên tệp nhưng cũng sẽ nhận được dấu chấm. Bạn có thể muốn cắt bớt chữ số cuối cùng từ nó trong mã của bạn.

[\w-]+\. 

Cập nhật

@Geoman nếu bạn có khoảng trống trong tên tập tin sau đó sử dụng các mô hình biến đổi dưới đây

[ \w-]+\.  (space added in brackets) 

Demo

+0

không thành công: 'c: \ fakepath \ some filename with spaces.png' –

+0

@GeomanYabes câu trả lời cập nhật để ghi lại không gian trong tên tệp –

3

Nếu bất cứ ai đang tìm kiếm một con đường cửa sổ tuyệt đối (và đường dẫn tương đối) javascript biểu thức chính quy trong javascript cho các tập tin:

var path = "c:\\my-long\\path_directory\\file.html"; 


((/(\w?\:?\\?[\w\-_\\]*\\+)([\w-_]+)(\.[\w-_]+)/gi).exec(path); 

Output là:

[ 
"c:\my-long\path_directory\file.html", 
"c:\my-long\path_directory\", 
"file", 
".html" 
] 
0

Dưới đây là một sửa đổi nhỏ để xuất sắc của Angelo câu trả lời cho phép các khoảng trống trong đường dẫn, tên tệp và tiện ích mở rộng cũng như các phần bị thiếu:

function parsePath (path) { 
    var parts = (/(\w?\:?\\?[\w\-_ \\]*\\+)?([\w-_ ]+)?(\.[\w-_ ]+)?/gi).exec(path); 
    return { 
     path: parts[0] || "", 
     folder: parts[1] || "", 
     name: parts[2] || "", 
     extension: parts[3] || "", 
    }; 
} 
0

Đây là một sự thay thế mà làm việc trên cửa sổ/unix:

"^(([A-Z]:)?[\.]?[\\{1,2}/]?.*[\\{1,2}/])*(.+)\.(.+)"

khối đầu tiên: con đường
khối thứ hai: giả
Thứ ba khối: tên file
khối thứ tư: mở rộng

Tested trên:

".\var\www\www.example.com\index.php" 
"\var\www\www.example.com\index.php" 
"/var/www/www.example.com/index.php" 
"./var/www/www.example.com/index.php" 
"C:/var/www/www.example.com/index.php" 
"D:/var/www/www.example.com/index.php" 
"D:\\var\\www\\www.example.com\\index.php" 
"\index.php" 
"./index.php" 
1

Đây chỉ là một chút biến trên @ HMD ấy, do đó bạn không cần phải cắt ngắn .

[ \w-]+?(?=\.) 

Demo

Thực sự, nhờ đi vào @hmd. Tôi chỉ cải thiện một chút về nó.

0

Cụm từ thông dụng này trích xuất phần mở rộng của tệp, nếu nhóm 3 không phải là phần mở rộng của nó.

.*\\(.*\.(.+)|.*$) 
Các vấn đề liên quan