0

我把我的最后一个帖子搞砸了。让我看看我能不能把这个做对..

谁能告诉我如何从 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);

}

我只想捕获:servername

没有斜线或任何东西。

4

4 回答 4

28

为什么还要使用正则表达式Uri呢?

    Uri uri = new Uri(@"\\servername\d$\directory");
    Console.WriteLine(uri.Host); // servername
    Console.WriteLine(uri.IsUnc); // true
于 2009-06-27T19:11:33.240 回答
3

这个任务很简单,它实际上并不需要正则表达式(它会非常过分)。

试试这种方法,它使用对string.Split. 它应该允许您轻松获得路径的每个部分(尽管您说您不需要它)。

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

如果您想完全手动进行解析,它仍然非常简单:

var serverName = uncPath.Substring(1, uncPath.IndexOf('\', 1) - 1);
于 2009-06-27T18:53:47.393 回答
1

注意:此答案用于教育目的 - 最好使用 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.
于 2009-06-27T20:26:29.907 回答
1

由于您正在尝试使用正则表达式来做到这一点,这就是我将如何做到的。这会产生您想要的结果。

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

产生服务器名

您可能必须允许一些其他潜在的服务器名称字符,例如 - 和 _ 但这是基本思想。

但是使用 Uri 类可能是解决这个特定问题的最佳方法。

于 2009-06-27T19:19:16.033 回答