【问题标题】:need a c# regex to get servername out of UNC需要一个 c# 正则表达式来从 UNC 中获取服务器名称
【发布时间】:2009-06-27 18:50:17
【问题描述】:

我把上一篇文章搞砸了。让我们看看我能不能把这个做对..

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

}

我只想捕获:服务器名

没有斜线或任何东西。

【问题讨论】:

    标签: c# regex url uri unc


    【解决方案1】:

    Uri 也可以使用正则表达式,为什么还要使用它?

        Uri uri = new Uri(@"\\servername\d$\directory");
        Console.WriteLine(uri.Host); // servername
        Console.WriteLine(uri.IsUnc); // true
    

    【讨论】:

      【解决方案2】:

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

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

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

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

      var serverName = uncPath.Substring(1, uncPath.IndexOf('\', 1) - 1);
      

      【讨论】:

      • 感谢您的快速回答!这可能是最好的方法。是的,这实际上是我开始的,但在这种情况下,我只是在寻找一个简单的例子,以便更好地理解正则表达式。
      • 仅供参考,C# split 是一个带有转义字符的虫子。我必须这样做:string server = directory.Split('\\')[2];
      【解决方案3】:

      注意:此答案用于教育目的 - 最好使用 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.
      

      【讨论】:

        【解决方案4】:

        由于您尝试使用正则表达式来执行此操作,因此我将这样做。 这会产生您想要的结果。

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

        产生 服务器名

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

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

        【讨论】:

        • 实际上,那些星号是我试图在此页面上将这句话加粗。没有他们会如何改变?
        • 没有它们也一样。
        • 它只是匹配 [] 括号中括号中指定的潜在字符。
        猜你喜欢
        • 2018-11-22
        • 2021-06-23
        • 1970-01-01
        • 1970-01-01
        • 2010-11-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多