2009-06-27 12 views
10

Qualcuno potrebbe dirmi come estrarre il nome del server da UNC?Come estrarre il nome del server da UNC

ex.

// servername/directory/directory

Edit : Mi scuso ma sembra che ho bisogno di chiarire un errore: il percorso è in realtà più simile a:

// servername/d $/directory

so che questo potrebbe cambiare le cose un po

+2

non sono percorsi UNC contengono caratteri barra rovesciata insted di forward slahes? – SztupY

+0

sì, è davvero divertente .. nessuno l'ha preso (incluso me!) – KevinDeus

risposta

18

Come su 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

questo dovrebbe fare il trucco.

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

Il nome del server si trova nel primo gruppo di cattura

+4

All'inizio di una riga (^), abbina due barre (//), quindi uno o più caratteri (+) che non è un'altra barra ([^/]) seguito da una o più occorrenze di qualcosa (. *) I paren "(" e ")" indicano un "gruppo di cattura". – bernie

+0

@Adam: Grazie per aver spiegato come funziona l'espressione regolare. –

+1

@Jason: felice di farlo. Un errore nella mia spiegazione: il simbolo * non è "uno o più", è "zero o più". Il simbolo + è 'uno o piu' – bernie

1

un'espressione regolare per trovare servername:

^//(\w+) 
+0

Sono un fan dei gruppi di acquisizione denominati, quindi probabilmente lo modificherò in:^// (? \ w +)/ – Lee

+2

\ w corrisponderà a [A-Za-z0-9_] - ma i nomi dei server può contenere molti più personaggi di quelli? –

6

Solo un'altra opzione, per il bene di che mostra diverse opzioni:

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


Il nome del server wi Sarà in \0 o $0 o semplicemente il risultato della funzione, a seconda di come lo chiami e che cosa offre la tua lingua.


Spiegazione in modalità regex commento:

(?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 per una risposta esauriente e ben spiegata. – bernie

+0

Ho provato questo in C# e ho ricevuto il seguente messaggio di errore: analisi "(? <=^//) [^ /] ++" - Quantificatore annidato +. – KevinDeus

+2

@ Kevin: basta rilasciare il secondo simbolo +. – bernie

0

brutto ma funziona solo:

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