2009-06-27 5 views
10

Кто-нибудь сможет рассказать мне, как вытащить имя сервера из UNC?Как вытащить имя сервера из UNC

ex.

// имя_сервера/каталог/каталог

Редактировать : Я извиняюсь, но, похоже, я должен разъяснить ошибку: путь на самом деле больше похож:

// имя_сервера/д $/каталог

Я знаю, что это может изменить вещи немного

+2

не являются UNC пути содержат символы обратной косой черты инстинкт форвардных слэшей? – SztupY

+0

Да, это действительно смешно .. никто не поймал этого (включая меня!) – KevinDeus

ответ

18

Как насчет 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

Это должно сделать трюк.

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

Имя сервера в первом захвате группе

+4

В начале строки (^) сопоставляем две косые черты (//), затем один или несколько символов (+), которые не являются другой косой чертой ([^/]), за которым следует одно или несколько вхождений чего угодно (. *) Параны "(" и ")" указывают на группу захвата. – bernie

+0

@Adam: Спасибо, что объяснили, как работает регулярное выражение. –

+1

@ Джейсон: рад это сделать. Ошибка в моем объяснении: символ * не является «одним или несколькими», это «ноль или больше». Символ + является «один или более» – bernie

1

Регулярного выражения для соответствия servername:

^//(\w+) 
+0

Я поклонник названных групп захвата, поэтому, вероятно, я бы изменил это на:^// (? \ w +)/ – Lee

+2

\ w будет соответствовать [A-Za-z0-9_] - но имена серверов может содержать гораздо больше символов, чем те? –

6

Просто еще один вариант, для показывающих различных вариантов:

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


Сервер имя будет в \0 или $0 или просто результат функции, в зависимости от того, как вы это называете и что предлагает ваш язык.


Объяснение в режиме регулярных выражений комментарий:

(?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 для очень тщательного и хорошо объясненного ответа. – bernie

+0

Я попробовал это на C# и получил следующее сообщение об ошибке: parsing "(? <=^//) [^ /] ++" - Вложенный квантификатор +. – KevinDeus

+2

@ Кевин: просто опустите второй символ +. – bernie

0

Уродливый, но он просто работает:

var host = uncPath.Split(new [] {'\\'}, StringSplitOptions.RemoveEmptyEntries).FirstOrDefault(); 

 Смежные вопросы

  • Нет связанных вопросов^_^