我搞砸了我的上一篇文章。让我们看看我能否做到这一点..
有人能告诉我如何从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
没有斜线或任何东西。
答案 0 :(得分:28)
为什么Uri
也会使用正则表达式?
Uri uri = new Uri(@"\\servername\d$\directory");
Console.WriteLine(uri.Host); // servername
Console.WriteLine(uri.IsUnc); // true
答案 1 :(得分:3)
这个任务很简单,它实际上并不需要一个正则表达式(这将是一种过度杀伤力)。
尝试使用此方法,该方法使用对string.Split
的简单调用。它应该允许你轻松地获得路径的每个部分(虽然你说你不需要它)。
var uncPath = @"\servername\d$\directory";
var serverName = uncPath.Split('\')[1];
如果你想完全手动完成解析,它仍然非常简单:
var serverName = uncPath.Substring(1, uncPath.IndexOf('\', 1) - 1);
答案 2 :(得分:1)
既然您正在尝试使用正则表达式,那么我就是这样做的。 这会产生你想要的结果。
string s = @"**\\\servername\d$\directory**";
Console.WriteLine(Regex.Match(s, @"[A-Za-z][A-Za-z0-9]*").Captures[0].Value);
Console.ReadLine();
产生 服务器名
您可能必须允许其他一些潜在的服务器名称字符,例如 - 和_但这是基本的想法。
但是使用Uri类可能是解决这个特定问题的最佳方法。
答案 3 :(得分:1)
注意:此答案仅用于教育目的 - 最好使用Uri对象而不是重新发明现有功能。
与the other question相同的解决方案,但反斜杠反转,因此被转义,(并且删除了占有量词,因为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.