2009-06-27 4 views
10

Quelqu'un pourrait-il me dire comment extraire le nom du serveur d'un UNC?Comment extraire le nom du serveur à partir d'un UNC

ex.

// servername/répertoire/répertoire

Modifier : Je suis désolé, mais il semble que je dois clarifier une erreur: le chemin est en fait plus:

// servername/d $/répertoire

Je sais que cela pourrait changer les choses un peu

+2

ne sont pas des chemins UNC contiennent des caractères backslash insted de slahes avant? – SztupY

+0

ouais c'est vraiment drôle .. personne ne l'a attrapé (y compris moi!) – KevinDeus

Répondre

18

Que diriez-vous Uri:

Uri uri = new Uri(@"\\servername\d$\directory"); 
string[] segs = uri.Segments; 
string s = "http://" + uri.Host + "/" + 
    string.Join("/", segs, 2, segs.Length - 2) + "/"; 
3

cela devrait faire l'affaire.

^//([^/]+).* 

Le nom du serveur est dans le premier groupe de capture

+4

Au début d'une ligne (^), faites correspondre deux barres obliques (//), puis un ou plusieurs caractères (+) qui ne sont pas une autre barre oblique ([^/]) suivi par une ou plusieurs occurrences de n'importe quoi (. *) Les parenthèses "(" et ")" indiquent un "groupe de capture". – bernie

+0

@Adam: Merci d'expliquer comment l'expression régulière fonctionne réellement. –

+1

@Jason: heureux de le faire. Une erreur dans mon explication: le symbole * n'est pas 'un ou plusieurs', c'est 'zéro ou plus'. Le symbole + est « un ou plusieurs » – bernie

1

Expression régulière pour correspondre servername:

^//(\w+) 
+0

Je suis un fan de groupes de capture nommés, donc je le modifierais probablement pour:^// (? \ w +)/ – Lee

+2

\ w correspondra [A-Za-z0-9_] - mais les noms de serveur peut contenir beaucoup plus de caractères que ceux-ci? –

6

Juste une autre option, pour le bien de montrer différentes options:

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


Le nom du serveur wi Soit en \0 ou $0 ou simplement le résultat de la fonction, selon la façon dont vous l'appelez et ce que votre langue offre.


Explication en mode commentaire regex:

(?x)  # flag to enable regex comments 
(?<=  # begin positive lookbehind 
^   # start of line 
//  # literal forwardslashes (may need escaping as \/\/ in some languages) 
)   # end positive lookbehind 
[^/]++ # match any non-/ and keep matching possessively until a/or end of string found. 
      # not sure .NET supports the possessive quantifier (++) - a greedy (+) is good enough here. 
+0

+1 pour une réponse très complète et bien expliquée. – bernie

+0

J'ai essayé celui-ci en C# et j'ai reçu le message d'erreur suivant: parsing "(? <=^//) [^ /] ++" - Quantificateur imbriqué +. – KevinDeus

+2

@Kevin: il suffit de déposer le second symbole +. – bernie

0

laid, mais il fonctionne simplement:

var host = uncPath.Split(new [] {'\\'}, StringSplitOptions.RemoveEmptyEntries).FirstOrDefault(); 
Questions connexes