è necessario un regex c # per ottenere servername da UNC
Domanda
Ho rovinato il mio ultimo post. Vediamo se riesco a farlo bene ..
Qualcuno potrebbe dirmi come estrarre il nome del server da un UNC? (Sto cercando una regex)
questa è la stringa da cui desidero estrarre il servername:
**\\\servername\d$\directory**
Il mio codice è in 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);
}
Sto cercando di catturare solo: servername
nessuna barra o altro.
Soluzione
Nota: questa risposta è a scopo didattico - è meglio usare l'oggetto Uri e non reinventare le funzioni esistenti.
Stessa soluzione di l'altra domanda , ma con le barre rovesciate invertite e quindi sfuggite (e il quantificatore possessivo rimosso, poiché regex C # non lo supporta):
(?<=^\\\\)[^\\]+
Il nome del server sarà in \0
o $0
o semplicemente il risultato della funzione, a seconda di come la chiami e di cosa offre C #.
Spiegazione in modalità commento regex:
(?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.
Altri suggerimenti
Perché usare regex quando Uri
lo farà anche?
Uri uri = new Uri(@"\\servername\d$\directory");
Console.WriteLine(uri.Host); // servername
Console.WriteLine(uri.IsUnc); // true
Questa attività è abbastanza semplice da non richiedere davvero una regex (sarebbe davvero eccessiva).
Prova questo approccio, che utilizza una semplice chiamata a string.Split
. Dovrebbe consentire di ottenere banalmente ogni parte del percorso (anche se dici di non averne bisogno).
var uncPath = @"\servername\d$\directory";
var serverName = uncPath.Split('\')[1];
Se si desidera eseguire l'analisi completamente manualmente, è ancora abbastanza semplice:
var serverName = uncPath.Substring(1, uncPath.IndexOf('\', 1) - 1);
Dato che stai provando a farlo con regex, ecco come lo farei. questo produce i risultati desiderati.
string s = @"**\\\servername\d$\directory**";
Console.WriteLine(Regex.Match(s, @"[A-Za-z][A-Za-z0-9]*").Captures[0].Value);
Console.ReadLine();
produce servername
potresti dover consentire altri potenziali caratteri servername come - e _ ma questa è l'idea di base.
Ma usare la classe Uri è probabilmente il modo migliore per risolvere questo specifico problema.