2009-06-27 6 views
0

J'ai foiré mon dernier message. Voyons si je peux obtenir celui-ci droit ..besoin d'un C# regex pour obtenir le nom de serveur hors de l'UNC

Quelqu'un pourrait-il me dire comment tirer le nom du serveur sur un UNC? (Je cherche une expression régulière)

c'est la chaîne que je veux tirer le servername de:

**\\\servername\d$\directory** 

Mon code est en 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); 

} 

Je cherche à capturer juste : nom_serveur

pas de barre oblique ou quoi que ce soit.

Répondre

1

Remarque: Cette réponse est à des fins éducatives - mieux vaut utiliser l'objet Uri et ne pas réinventer les fonctions existantes.

Même solution que sur the other question, mais avec anti-slash inversé, et donc se sont échappés (et quantificateurs possessifs enlevé, puisque C# regex ne supporte pas):

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


Le nom du serveur sera dans \0 ou $0 ou simplement le résultat de la fonction, selon la façon dont vous l'appelez et ce que C# offre.


Explication en mode commentaire 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. 
3

Cette tâche est assez simple pour qu'elle ne nécessite pas vraiment d'expression rationnelle (ce serait beaucoup trop).

Essayez cette approche, qui utilise un simple appel à string.Split. Cela devrait vous permettre d'obtenir chaque partie du chemin de façon triviale (bien que vous disiez que vous n'en avez pas besoin).

var uncPath = @"\servername\d$\directory";  
var serverName = uncPath.Split('\')[1]; 

Si vous vouliez faire l'analyse entièrement manuellement, il est encore assez simple:

var serverName = uncPath.Substring(1, uncPath.IndexOf('\', 1) - 1); 
+0

Merci pour la réponse rapide! C'est probablement le meilleur moyen de le faire .. Ouais c'est en fait ce que j'ai commencé avec, mais dans ce cas, je cherche juste un exemple simple afin que je puisse mieux comprendre regex. – KevinDeus

+0

FYI, C# split est un bugger avec ce caractère d'échappement. Je devais faire ceci: string server = directory.Split ('\\') [2]; – KevinDeus

28

Pourquoi utiliser regex quand Uri va le faire aussi?

Uri uri = new Uri(@"\\servername\d$\directory"); 
    Console.WriteLine(uri.Host); // servername 
    Console.WriteLine(uri.IsUnc); // true 
+0

J'aime beaucoup celui-ci. Celui-ci est vraiment cool. – KevinDeus

1

Puisque vous essayez de le faire avec regex, voici comment je le ferais. cela produit les résultats que vous vouliez.

string s = @"**\\\servername\d$\directory**"; 
Console.WriteLine(Regex.Match(s, @"[A-Za-z][A-Za-z0-9]*").Captures[0].Value); 
Console.ReadLine(); 

produit servername

vous pourriez avoir à permettre d'autres personnages potentiels servername comme - et _ mais cela est l'idée de base. Mais l'utilisation de la classe Uri est probablement le meilleur moyen de résoudre ce problème spécifique.

+0

effectivement ces astérisques étaient moi essayant d'obtenir cette phrase à gras sur cette page. Comment cela changerait-il sans eux? – KevinDeus

+0

ce serait pareil sans eux. – jasonmw

+0

il correspond juste aux caractères potentiels spécifiés entre les crochets []. – jasonmw

Questions connexes