2017-03-14 14 views
-3

ich einen String ausgegeben haben, die wie folgt aussieht:C# .net regex eine Zeichenfolge aus einem String extrahieren

ID  = GC5c.U.feab4bc5-8-92e-c486eaddddf8 
AESKEY1 = efbf5c9db259e345c205b0da27f6fb459D 
AESKEY2 = ea85af9f1e5f42ff4fe8b9f07e7dcebc68 
DESKEY1 = 6388a9e1a2fc8981189f0f412ae4e8 

ID  = JNPa.T.71664548-82-be2-a51aadd4a6f3 
AESKEY1 = 37af9242c8879414e420f46903c16adebd3 
AESKEY2 = 1259a1f6f6da03cb3984a117ca617d9ff73 
DESKEY1 = 9547dc08db70cb95789f3a59e5c6adebd31 

Wie kann ich durch die ID iterieren (en) dieser Liste und erhalten Sie die Werte innerhalb der Schnur?

Antwort

2

Öffnen Sie die Datei, durch jede Zeile durchlaufen, und es in ein Dictionary<string, string>

Dictionary<string, string> data = new Dictionary<string, string>(); 

using(StreamReader reader = new StreamReader("C:/YourFilePath.txt")) 
{  
    while (reader.Peek() >= 0) 
    { 
     string[] line = reader.ReadLine().Split('='); 
     data.Add(line[0].TrimEnd(), line[1].TrimStart()); 
    } 
} 
setzen

UPDATE: Beachten Sie, dass diese Lösung Dictionary verwendet und daher keine doppelten Schlüssel erlaubt. Wenn Sie Schlüssel duplizieren müssen, würde ich vorschlagen, diese Lösung für eine List<KeyValuePair<string, string>> zu ändern. Der Code wird ein wenig dreckiger durch die Quere kommen:

List<KeyValuePair<string, string>> data = new List<KeyValuePair<string, string>>(); 

using(StreamReader reader = new StreamReader("C:/YourFilePath.txt")) 
{  
    while (reader.Peek() >= 0) 
    { 
     string[] line = reader.ReadLine().Split('='); 
     data.Add(new KeyValuePair(line[0].TrimEnd(), line[1].TrimStart())); 
    } 
} 
1

Ich bin nicht sicher, Regex am besten geeignet für dieses Szenario ist jedoch finden Sie weiter unten eine Lösung "id" es mit einer benannten Gruppe verwenden.

var regex = new Regex(@"id.*=\s*(?<id>.+)", RegexOptions.IgnoreCase); 
var input = @"ID  = Gs3c.H.feab4bc5-6c00-4ee8-9e2e-c486eaddddf8 
       AESKEY1 = efbf5c9db259e345c205b0da27f6fb459D 
       AESKEY2 = ea85af9f1e5f42ff4fe8b9f07e7dcebc68 
       DESKEY1 = 6388a9e1a2fc8981189f0f412ae4e8 

       ID  = JNPa.T.71664548-82-be2-a51aadd4a6f3 
       AESKEY1 = 37af9242c8879414e420f46903c16adebd3 
       AESKEY2 = 1259a1f6f6da03cb3984a117ca617d9ff73 
       DESKEY1 = 9547dc08db70cb95789f3a59e5c6adebd31"; 

var ids = regex.Matches(input).Cast<Match>().Select(m => m.Groups["id"]); 

Hier ist der Regex Test: Regex test

0

NicoRiff Vorschlag regelmäßige Analyse in ein Dictionary zu verwenden, ist der Weg zu gehen. Hier ist der obligatorische LINQ-basierte Ansatz:

var data = File.ReadLines("C:/your/file/path.txt") 
       .Select(l => l.Split('=')) 
       .ToDictionary(k => k[0], v => v[1]); 

EDIT: Wie Nico wies darauf hin, wenn die Wörterbuch Nachschlüssel enthalten wird, dann ist ein Wörterbuch nicht. Sie können LINQ jedoch weiterhin verwenden, um das Wörterbuch automatisch anzuordnen, sodass das ID-Feld des Quelltexts der Schlüssel anstelle der Feldnamen ist. Zum Beispiel können Sie die folgende verwenden:

var data = File.ReadLines("C:/your/file/path.txt") 
       .Where(l => !String.IsNullOrEmpty(l)) 
       .Select((l, i) => new { ID = i/4, Value = l.Split('=') }) 
       .GroupBy(x => x.ID) 
       .Select(g => new { ID = g.First().Value[1].Trim(), Values = g.ToDictionary(k => k.Value[0].Trim(), v => v.Value[1].Trim()) }) 
       .ToDictionary(k => k.ID, v => v.Values); 

Danach können Sie durch data iterieren auf Ihre Felder zu erhalten:

foreach (var d in data.Values) 
{ 
    string id = d["ID"]; 
    string aesKey1 = d["AESKEY1"]; 
    string aesKey2 = d["AESKEY2"]; 
    string desKey1 = d["DESKEY1"]; 
} 
+0

Zuerst scheint es, dass Dictionary der Weg war, um diesen zu lösen. Aber es scheint, dass OP doppelte Schlüssel im Wörterbuch haben muss, also nehme ich an, dass das nicht funktioniert. Ich habe meine Antwort bearbeitet, um einen nützlichen Workaround zu diesem Thema zu geben. – NicoRiff

+0

@NicoRiff Ich arbeite auch an einer Lösung. – Abion47

+0

@NicoRiff Siehe bearbeiten. – Abion47

0

Wenn Sie die Daten in ein Wörterbuch setzen möchten wie: Dicationary<string, Dictionary<string,string>>
Wenn key des Hauptwörterbuchs der Wert von ID ist und die internen Wörterbücher die folgenden Werte sind, dann würde Folgendes der Fall sein:

string[] lines = input.Split('\n'); 
var myDict = new Dictionary<string, Dictionary<string,string>>(); 
var currentKey = ""; 

foreach (string[] keyVal in lines.Where(line=>!string.IsNullOrWhiteSpace(line)) 
           .Select(line => line.Split('='))) 
{ 
    if (keyVal[0].StartsWith("ID")) 
    { 
     currentKey = keyVal[1].Trim(); 
     myDict.Add(currentKey, new Dictionary<string, string>()); 
    } 
    else 
    { 
     myDict[currentKey].Add(keyVal[0].Trim(), keyVal[1].Trim()); 
    } 
} 
Verwandte Themen