2017-01-15 2 views
-3

ich eine Zeichenfolge analysieren müssen, die eine der folgenden sein kann:Extract Zertifikatnamen mit Regex in C#

"CN=bbb1, OU=b, O=b, L=b, S=b, C=US"  //expected result bbb1 
"CN=*.host.com, OU=b, O=b, L=b, S=b, C=US" //expected result *.host.com 
"CN = *.host.com "       //expected result *.host.com 
"CN = bbb1 "        //expected result bbb1 

ich folgende Parsing-Funktion für das schrieb:

public static string GetCertificateName(string certSubject) 
    { 
     System.Text.RegularExpressions.Regex regex; 
     try 
     { 
      regex = new System.Text.RegularExpressions.Regex(@"CN\s*=\s*(?<name>\w+)"); 
      var match = regex.Match(certSubject); 
      return match.Groups["name"].Value; 
     } 
     catch(Exception ex) 
     { 
      Console.WriteLine(ex.Message); 
     } 

    return "Can't parse"; 
} 
static void Main(string[] args) 
{ 
    Console.WriteLine(GetCertificateName("CN=bbb1, OU=b, O=b, L=b, S=b, C=US")); //bbb1 
    Console.WriteLine(GetCertificateName("CN = bbb3 "));//bb33 
    Console.WriteLine(GetCertificateName("CN = bbb4\n\t "));//bbb4 
    Console.WriteLine(GetCertificateName("CN=*.host.com"));//empty string!!! != *.host.com 
    Console.ReadLine(); 
} 

Bitte helfen Sie mir meine Parsing-Funktion so GetCertificateName ("CN = *. host.com") Anruf zurück * .host.com vielen Dank, Natalie

+2

'Bitte helfen Sie mir improve' Was genau muss verbessert werden? – Abion47

+0

'\ w +' stimmt nicht mit '*' überein. Ändern Sie es in '\ S +' oder '[\ w *] +' und es sollte funktionieren. –

+0

Überprüfen Sie dies: https://regex101.com/r/LsTjYb/3 – MYGz

Antwort

1

Falls zu verbessern CN ist in der Anfang der Zeichenfolge (wie wir in allen Beispielen sehen) Sie Linq Lösung versuchen können (bei = beginnen, bei , zu stoppen, schneiden Sie die Mitte)

string source = "CN = *.host.com "; 

    string result = string.Concat(source 
     .SkipWhile(c => c != '=') 
     .Skip(1) 
     .TakeWhile(c => c != ',')) 
    .Trim(); 

Oder sogar gut alt IndexOf und Substring:

string source = "CN =*.host.com,"; 

    int start = source.IndexOf('=') + 1; 
    int stop = start <= 0 ? - 1 : source.IndexOf(',', start); 

    string result = start <= 0 ? null 
    : stop >= 0 ? source.Substring(start, stop - start).Trim() 
    : source.Substring(start).Trim(); 
+1

Vielleicht möchte klarstellen, dass das "CM" -Feld garantiert am Anfang der Zeichenfolge ist. – Abion47

+0

@ Abion47: Ich möchte diese Schlüsselbedingung in der Antwort wirklich erwähnen. Vielen Dank! Schöner Fang! –

0

Meine Lösung, die funktioniert :)

public static string GetCertificateName(string certSubject) 
{ 
    //"CN=bbb1, OU=b, O=b, L=b, S=b, C=US" 
    System.Text.RegularExpressions.Regex regex; 
    try 
    { 
     regex = new System.Text.RegularExpressions.Regex(@"CN\s*=\s*(?<name>\*?\.?\w*\.?\w+)"); 
     var match = regex.Match(certSubject); 
     return match.Groups["name"].Value; 
    } 
    catch(Exception ex) 
    { 
     Console.WriteLine(ex.Message); 
    } 

    return "Can't parse"; 
} 
+0

Können Sie eine Eingabe wie '" CN = *. Host. *, "'? In diesem Fall ist die Übereinstimmung "" .host "' –

+0

Dmitry, danke für deine Antwort, in meinem Fall kann ich annehmen, dass die Eingabe nicht * .host. * Sein wird, aber ich habe wirklich nicht darüber nachgedacht. –

0

Zusätzliche Antwort ohne von regulären Ausdrücken:

public static string Parsing(string certSubject) 
    { 
     string[] strArr = certSubject.Split(new char[] { '=', ' ', '\t', '\n',',' }); 
    string subject = ""; 

    for (int i = 0; i < strArr.Length; i++) 
    { 
     if (strArr[i].Equals("cn", StringComparison.InvariantCultureIgnoreCase)) 
     { 
      if ((i + 1) < strArr.Length) 
      { 

       subject = strArr[i + 1]; 
       break; 
      } 
     } 
    } 

    if (subject.Length > 0) 
    { 
     return subject; 
    } 
    return "Can't parse"; 
} 
+0

'string [] strArr = certSubject.Split (neues Zeichen [] {'=', '', '\ t', '\ n', ','}, StringSplitOptions.RemoveEmptyEntries);' filtert alle leeren Chunks heraus –

+0

Können Sie eine Eingabe wie folgt haben? "" CN = file: \\ c: \ Programme \ MyFile.txt "'; Es ist der * Raum * (zwischen 'Program' und' Files'), der den Lüfter zerstört –

+0

Sie haben Recht, ich bleibe bei der regulären Ausdruck Lösung. –