2009-06-27 36 views
10

Có ai có thể cho tôi biết cách rút tên máy chủ ra khỏi UNC không?Cách lấy tên máy chủ từ UNC

ví dụ:

// servername/thư mục/thư mục

Sửa : Tôi xin lỗi nhưng có vẻ như tôi cần phải làm rõ một sai lầm: con đường thực sự là giống như:

// servername/d $/thư mục

tôi biết điều này có thể thay đổi mọi thứ một chút

+2

không đường dẫn UNC chứa các ký tự dấu chéo ngược insted của slahes về phía trước? – SztupY

+0

yeah thats thực sự funny .. không ai bắt được (bao gồm cả tôi!) – KevinDeus

Trả lời

18

Làm thế nào về Uri:

Uri uri = new Uri(@"\\servername\d$\directory"); 
string[] segs = uri.Segments; 
string s = "http://" + uri.Host + "/" + 
    string.Join("/", segs, 2, segs.Length - 2) + "/"; 
3

này nên làm các trick.

^//([^/]+).* 

Tên máy chủ là trong nhóm chụp đầu tiên

+4

Khi bắt đầu một dòng (^), kết hợp hai dấu gạch chéo về phía trước (//), sau đó một hoặc nhiều (+) ký tự không phải là dấu gạch chéo khác ([^/]) theo sau bởi một hoặc nhiều lần xuất hiện của bất cứ điều gì (. *) Các parens "(" và ")" chỉ ra một 'nhóm chụp'. – bernie

+0

@Adam: Cảm ơn bạn đã giải thích cách biểu thức chính quy thực sự hoạt động. –

+1

@ Jason: vui lòng làm như vậy. Một sai lầm trong lời giải thích của tôi: biểu tượng * không phải là 'một hoặc nhiều', nó là 'không hoặc nhiều hơn'. Biểu tượng + là 'một hoặc nhiều' – bernie

1

biểu hiện thường xuyên để phù hợp với servername:

^//(\w+) 
+0

Tôi là người hâm mộ các nhóm chụp có tên, vì vậy tôi có thể sửa đổi thành:^// (? \ w +)/ – Lee

+2

\ w sẽ khớp với [A-Za-z0-9_] - nhưng tên máy chủ có thể chứa nhiều ký tự hơn những ký tự đó? –

6

Chỉ cần một lựa chọn, vì lợi ích hiển thị tùy chọn khác nhau:

(?<=^//)[^/]++ 


Tên máy chủ wi sẽ ở trong \0 hoặc $0 hoặc đơn giản là kết quả của hàm, tùy thuộc vào cách bạn gọi nó và ngôn ngữ của bạn cung cấp.


Giải thích trong chế độ regex bình luận:

(?x)  # flag to enable regex comments 
(?<=  # begin positive lookbehind 
^   # start of line 
//  # literal forwardslashes (may need escaping as \/\/ in some languages) 
)   # end positive lookbehind 
[^/]++ # match any non-/ and keep matching possessively until a/or end of string found. 
      # not sure .NET supports the possessive quantifier (++) - a greedy (+) is good enough here. 
+0

+1 cho câu trả lời rất kỹ lưỡng và được giải thích kỹ lưỡng. – bernie

+0

Tôi đã thử cái này trong C# và nhận được thông báo lỗi sau: phân tích cú pháp "(? <=^//) [^ /] ++" - Bộ định lượng lồng nhau +. – KevinDeus

+2

@Kevin: chỉ cần thả biểu tượng + thứ hai. – bernie

0

Ugly nhưng nó chỉ hoạt động:

var host = uncPath.Split(new [] {'\\'}, StringSplitOptions.RemoveEmptyEntries).FirstOrDefault(); 
Các vấn đề liên quan