2008-12-10 8 views
3

Je veux extraire 'James \, Brown' de la chaîne ci-dessous mais je ne sais pas toujours quel sera le nom. La virgule me cause un peu de difficulté alors que suggérez-vous d'extraire James \, Brown?C# Extraire un nom d'une chaîne

OU = James \, Brown, OU = Test, DC = interne, DC = net

Merci

+1

Dommage que vous ne puissiez pas obtenir l'API que vous utilisez pour vous donner la sortie dans un format structuré. L'analyse est fastidieuse. –

Répondre

0

Si le format est toujours le même:

string line = GetStringFromWherever(); 

int start = line.IndexOf("=") + 1;//+1 to get start of name 
int end = line.IndexOf("OU=",start) -1; //-1 to remove comma 

string name = line.Substring(start, end - start); 

pardonnerez si la syntaxe est pas tout à fait raison - de la mémoire. Évidemment, ce n'est pas très robuste et échoue si le format change.

Cheers.

+0

En fait, le second paramètre de SubString est longueur, pas endIndex. Dans votre exemple, il DEVRAIT être name = line.SubString (start, end - start). J'ai toujours détesté cela à propos de Substring, qui est la raison pour laquelle j'ai créé des méthodes d'extension qui autorisent startIndex et endIndex. – BFree

+0

xan - J'ai édité pour corriger la syntaxe, puisque je suis devant une machine avec Snippetcompiler installé. :) – ZombieSheep

2

tout à fait de façon fragile pour le faire peut-être ...

string name = @"OU=James\, Brown,OU=Test,DC=Internal,DC=Net"; 
string[] splitUp = name.Split("=".ToCharArray(),3); 
string namePart = splitUp[1].Replace(",OU",""); 
Console.WriteLine(namePart); 

Je préconiserais pas nécessairement cette méthode, mais je viens de revenir d'un lyunch de Noël du ministère et mon cerveau n'est pas complètement engagé encore.

+1

Salut, mon nom est "Foo, OUBar" mais vous pouvez m'appeler "FooBar" ;-) – VVS

8

Un regex est probablement votre meilleure approche

static string ParseName(string arg) { 
    var regex = new Regex(@"^OU=([a-zA-Z\\]+\,\s+[a-zA-Z\\]+)\,.*$"); 
    var match = regex.Match(arg); 
    return match.Groups[1].Value; 
} 
+0

Une bonne approche, mais dont j'ai une peur irrationnelle. :) – ZombieSheep

+1

Surmontez votre peur :) – samjudson

+1

Mais pour ce faire, je dois admettre que ma peur est fausse, et en tant que Yorkshireman, je ne me trompe jamais. ;-) – ZombieSheep

0

Si la barre oblique est toujours là, je regardais potentiellement en utilisant RegEx pour faire le match, vous pouvez utiliser un groupe de correspondance pour les noms et prénoms.

^OU = ([a-zA-Z] ) \, \ s ([a-zA-Z])

Cette expression rationnelle correspond à des noms qui incluent des caractères seulement, vous aurez besoin d'affiner c'est un peu mieux pour les noms non standards. Here is a RegEx tester pour vous aider le long du chemin si vous suivez cette route.

4

Vous pouvez utiliser une expression régulière:

string input = @"OU=James\, Brown,OU=Test,DC=Internal,DC=Net"; 
Match m = Regex.Match(input, "^OU=(.*?),OU=.*$"); 
Console.WriteLine(m.Groups[1].Value); 
1

Je commencerais avec un regex pour séparer les groupes:

Regex rx = new Regex(@"(?<!\\),"); 
    String test = "OU=James\\, Brown,OU=Test,DC=Internal,DC=Net"; 
    String[] segments = rx.Split(test); 

Mais à partir de là, je diviserait les paramètres dans le tableau en les décomposant manuellement, de sorte que vous n'ayez pas besoin d'utiliser une expression rationnelle qui dépend de plus que le caractère séparateur utilisé. Comme cela ressemble à une requête LDAP, cela n'a pas d'importance si vous regardez toujours params [0], mais il y a une chance que le nom soit défini comme "CN =". Vous pouvez couvrir les deux cas, en lisant simplement la requête comme ceci:

String name = segments[0].Split('=', 2)[1]; 
1

qui ressemble étrangement à un serveur LDAP ou Active Directory nom distinctif formaté selon RFC 2253/4514.

Sauf si vous travaillez avec des noms connus et/ou êtes en accord avec une hackaround fragile (comme les solutions regex) - alors vous devriez commencer par lire la spécification.

Si vous, comme moi, détestent généralement l'implémentation du code selon les RFC - alors espérons que this guy a fait un meilleur travail en suivant les spécifications que vous le feriez. Au moins, il revendique pour être conforme à 2253.

0

Remplacez \, par votre propre chaîne magique préférée (peut-être & # 44;), divisez-la sur les virgules restantes ou recherchez la première virgule, puis remplacez votre chaîne magique par une simple virgule.

dire quelque chose comme:

string originalStr = @"OU=James\, Brown,OU=Test,DC=Internal,DC=Net"; 
string replacedStr = originalStr.Replace("\,", "&#44;"); 

string name = replacedStr.Substring(0, replacedStr.IndexOf(",")); 
Console.WriteLine(name.Replace("&#44;", ",")); 
Questions connexes