нужен регулярный выражения c #, чтобы получить имя сервера из UNC - PullRequest
0 голосов
/ 27 июня 2009

Я испортил свой последний пост. Давайте посмотрим, смогу ли я сделать это правильно ..

Может ли кто-нибудь сказать мне, как извлечь имя сервера из UNC? (Я ищу регулярное выражение)

это строка, из которой я хочу получить имя сервера:

**\\\servername\d$\directory**

Мой код на C #

Regex r = new Regex(?????, RegexOptions.IgnoreCase);

Match m = r.Match(@"\\servername\d$\directory"); 

CaptureCollection cc = m.Captures;

foreach (Capture c in cc)
{

    System.Console.WriteLine(c);

}

Я хочу захватить только: имя_сервера

без косых черт или чего-либо еще.

Ответы [ 4 ]

28 голосов
/ 27 июня 2009

Зачем использовать регулярное выражение, если Uri тоже это сделает?

    Uri uri = new Uri(@"\\servername\d$\directory");
    Console.WriteLine(uri.Host); // servername
    Console.WriteLine(uri.IsUnc); // true
3 голосов
/ 27 июня 2009

Эта задача достаточно проста, так что на самом деле она не требует регулярных выражений (это было бы слишком излишним).

Попробуйте этот подход, который использует простой вызов string.Split. Это должно позволить вам получить каждую часть пути тривиально (хотя вы говорите, что вам это не нужно).

var uncPath = @"\servername\d$\directory";    
var serverName = uncPath.Split('\')[1];

Если вы хотите выполнить синтаксический анализ полностью вручную, это все еще довольно просто:

var serverName = uncPath.Substring(1, uncPath.IndexOf('\', 1) - 1);
1 голос
/ 28 июня 2009

Примечание. Этот ответ предназначен для образовательных целей - лучше использовать объект Uri, а не заново изобретать существующие функции.

То же решение, что и на другой вопрос , но с обратными слешами, обратными и, следовательно, экранированными (и удаленным собственническим квантификатором, поскольку C # регулярное выражение не поддерживает это):

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


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


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

(?x)      # flag to enable regex comments
(?<=      # begin positive lookbehind
^         # start of line
\\\\      # escaped backslashes to give literal \\ chars.
)         # end positive lookbehind
[^\\]+    # greedily match any non-\ until a \ or end of string found.
1 голос
/ 27 июня 2009

Так как вы пытаетесь сделать это с помощью регулярных выражений, вот как я бы это сделал. это дает результаты, которые вы хотели.

string s = @"**\\\servername\d$\directory**";
Console.WriteLine(Regex.Match(s, @"[A-Za-z][A-Za-z0-9]*").Captures[0].Value);
Console.ReadLine();

производит имя_серверы

вам, возможно, придется учесть некоторые другие потенциальные символы имени сервера, например - и _, но это основная идея.

Но использование класса Uri, вероятно, является лучшим способом решения этой конкретной проблемы.

...