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.

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top