Как вытащить имя сервера из UNC

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

ех.

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

Edit : I apologize but it looks like I need to clarify a mistake: the path actually is more like:

//servername/d$/directory

Я знаю, что это может немного изменить ситуацию

 SztupY27 июн. 2009 г., 21:31
Треки UNC не содержат символов обратной косой черты, вставленных в прямые слэши?
 KevinDeus30 июн. 2009 г., 00:57
да это действительно смешно .. никто не поймал это (включая меня!)

Ответы на вопрос(5)

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

^//(\w+)
 27 июн. 2009 г., 19:19
Я фанат именованных групп захвата, поэтому я, вероятно, изменил бы это на: ^ // (? & Lt; serverName & gt; \ w +) /
 27 июн. 2009 г., 20:03
\ w будет соответствовать [A-Za-z0-9_] - но имена серверов могут содержать намного больше символов, чем эти?

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

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


Имя сервера будет в\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.
 27 июн. 2009 г., 20:17
+1 за очень подробный и понятный ответ.
 27 июн. 2009 г., 20:53
@Kevin: просто брось второй символ +.
 KevinDeus27 июн. 2009 г., 20:20
Я попробовал это в C # и получил следующее сообщение об ошибке: parsing & quot; (? & Lt; = ^ //) [^ /] ++ & quot; - вложенный квантификатор +.

Это должно сделать свое дело.

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

Имя сервера находится в первой группе захвата

 KevinDeus27 июн. 2009 г., 20:18
используя комментарий 1 здесь я получаю следующее в c #: // имя_сервера / есть ли способ снять косую черту? (моя программа) Regex r = new Regex (@ & quot; ^ // (? & lt; имя_сервера & gt; \ w +) / & quot ;, RegexOptions.IgnoreCase); Match m = r.Match (@ & quot; // имя_сервера / directory / directory & quot;); CaptureCollection cc = m.Captures; foreach (захват c в cc) {System.Console.WriteLine (c); }
 27 июн. 2009 г., 19:26
В начале строки (^) сопоставьте две косые черты (//), затем один или несколько (+) символов, которые не являются другой косой чертой ([^ /]), за которыми следует одно или несколько вхождений чего-либо (. *) "Пареньс" ("и") " указать 'группу захвата'.
 27 июн. 2009 г., 20:14
@ Джейсон: рад это сделать. Ошибка в моем объяснении: символ * не является «одним или несколькими», он равен «нулю или более». Символ + обозначает «один или несколько»;
 27 июн. 2009 г., 20:04
@ Adam: Спасибо за объяснение, как на самом деле работает регулярное выражение.
Решение Вопроса

Uri:

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

Ваш ответ на вопрос