2008-10-09 9 views
17

Je souhaite supprimer les informations de domaine/ordinateur d'un ID de connexion en C#. Donc, je voudrais faire "Domain \ me" ou "Domain \ me" juste "moi". Je pourrais toujours vérifier l'existence de l'un ou de l'autre, et l'utiliser comme index pour démarrer la sous-chaîne ... mais je cherche quelque chose de plus élégant et compact.Supprimer les informations de domaine de l'ID de connexion en C#

Pire scénario:

int startIndex = 0; 
int indexOfSlashesSingle = ResourceLoginName.IndexOf("\"); 
int indexOfSlashesDouble = ResourceLoginName.IndexOf("\\"); 
if (indexOfSlashesSingle != -1) 
    startIndex = indexOfSlashesSingle; 
else 
    startIndex = indexOfSlashesDouble; 
string shortName = ResourceLoginName.Substring(startIndex, ResourceLoginName.Length-1); 

Répondre

36

quand tout ce que vous avez est un marteau, tout ressemble à un clou .....

utiliser une lame de rasoir ----

using System; 
using System.Text.RegularExpressions; 
public class MyClass 
{ 
    public static void Main() 
    { 
     string domainUser = Regex.Replace("domain\\user",".*\\\\(.*)", "$1",RegexOptions.None); 
     Console.WriteLine(domainUser); 

    } 

} 
+0

Excellent point, en utilisant RegEx est une solution beaucoup plus élégante – Dan

+4

Et si le nom est [email protected]? Toute solution de lame 5-razer là? Merci – DoomerDGR8

+1

A également dû le faire récemment (en supprimant la partie de domaine de 'NTAccount') et est venu avec soit' Regex.Match (value, "([^\\\\] +) $ ", RegexOptions.None) .Groups [0] .Captures [0] .Value' pour extraire directement la partie nom du compte, ou' Regex.Replace (valeur, "^. * \\ \\ ", string.Empty, R egexOptions.None); 'pour tout supprimer jusqu'au nom de compte souhaité. Même différence :) – rdev5

3

Je fais toujours cette façon:

string[] domainuser; 
    string Auth_User = Request.ServerVariables["AUTH_USER"].ToString().ToLower(); 
    domainuser = Auth_User.Split('\\'); 

Maintenant, vous pouvez regarder domainuser.Length pour voir combien de pièces sont là et DomainUser [0] pour le domaine et domainuser [1] pour le nom d'utilisateur.

2
 string theString = "domain\\me"; 
     theString = theString.Split(new char[] { '\\' })[theString.Split(new char[] { '\\' }).Length - 1]; 
+0

Oui, c'est comme ça que je le fais aussi avec l'ajout de la conversion de BoltBait, car il est toujours utile d'avoir les noms d'utilisateurs dans un boîtier "contrôlé" (par exemple: –

+0

Bon point, Kevin. J'ai aussi pensé que la vitesse n'était définitivement pas un problème dans ce cas, d'où les appels multiples à diviser, etc Makes pour le code moche, mais ... –

24

Vous pouvez abuser de la classe Path , ainsi:

string shortName = System.IO.Path.GetFileNameWithoutExtension(ResourceLoginName); 
+2

Nice, c'est intelligent. – Pete

+12

Probablement préférable d'utiliser System.IO.Path.GetFileName (ResourceLoginName) dans le cas où ResourceLoginName contient un point (par exemple, roger.smith), ce qui est parfaitement acceptable en termes d'Active Directory et vraisemblablement d'autres systèmes de répertoires. – endian

+1

Il se sent tellement mal d'utiliser ceci - mais si juste en même temps lol ... – derekmx271

4

Comment est sur:

string shortName = ResourceLoginName.Split('\\')[1] 
1

Cela fonctionne pour les connexions de domaine valides:

var regex = @"^(.*\\)?([^\@]*)(@.*)?$"; 
var user = Regex.Replace("domain\\user", regex, "$2", RegexOptions.None); 
user = Regex.Replace("[email protected]", regex, "$2", RegexOptions.None); 
2

Cela fonctionne pour les deux, mais avec des groupes nommés.

^(?<domain>.*)\\(?<username>.*)|(?<username>[^\@]*)@(?<domain>.*)?$ 
0

Piggy sur Derek sauvegarde Smalls ... Réponse

Regex.Replace(User.Identity.Name,@"^(?<domain>.*)\\(?<username>.*)|(?<username>[^\@]*)@(?<domain>.*)?$", "${username}", RegexOptions.None) 

a fonctionné pour moi.