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#正規表現はそれをサポートしていないため、所有格の数量詞は削除されています)。

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


サーバー名は、呼び出し方法とC#が提供するものに応じて、関数内\0または$0関数の結果になります。


正規表現コメントモードでの説明:

(?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 に答える