2017-05-30 8 views
1

Hallo Ich habe fest einfache Frage zu beenden, aber ich bin kein regex ace: Ich habe eine Zeichenfolge, die etwa wie folgt aussieht:aus Zeichenfolge Lesen der Zeichenfolge

Some text 

Error codes: 

10001 iTPM full self test 
10003 less than minimum required 
10004 bad tag value 
10005 bad param size 
10006 fail check 

Und mit regex ich bin versucht zu

(?<=Error codes:\n)(?s)(.*?)(fail check) 

es funktioniert, aber es ist eine Strecke Lösung, möchte ich mit Lesen sie diese letzte Gruppe ersetzen: Text von Fehlercodes :, aber ohne es, bis zum Ende der Zeichenfolge

Bisher ich habe bis zum Ende aber bis jetzt kein Glück.

Text enthält Zeilentrenner, da diese Informationen benötigt werden.

sagen Lets C# meine Wahl der Sprache sein wird

Ergebnis aussehen Erwartete shold:

10001 iTPM full self test 
10003 less than minimum required 
10004 bad tag value 
10005 bad param size 
10006 fail check 

Ich möchte bis zum Ende der Zeichenfolge lesen, da ich mir nicht sicher sein kann, wenn einige neue Codes werden nicht hinzugefügt werden.

+0

irgendwelche Präferenzen Programmiersprachen? – RomanPerekhrest

+0

Sagen wir C# wird meine Sprachwahl sein –

+0

Sieht so aus, als ob Sie eine komplexe Textdatei haben, die Sie analysieren wollen. Regex kann zum Extrahieren eines Teils der Textdatei geeignet sein, aber es gibt möglicherweise bessere Methoden zum Analysieren der gesamten Datei. – jdweng

Antwort

1

Wenn "Lassen Sie uns sagen C# wird meine Wahl der Sprache sein" Ich schlage vor, die Kombination von Linq und reguläre Ausdrücke:

using System.Linq; 
using System.Text.RegularExpressions; 

... 

string source = 
    @"Some text 

Error codes: 

10001 iTPM full self test 
10003 less than minimum required 
10004 bad tag value 
10005 bad param size 
10006 fail check"; 

var result = source 
    .Split(new char[] { '\r', '\n' }, StringSplitOptions.RemoveEmptyEntries) 
    .SkipWhile(line => !line.StartsWith("Error codes:")) 
    .Select(line => Regex.Match(line, @"^(?<code>[0-9]+)\s*(?<name>.+)$")) 
    .Where(match => match.Success) // Or .TakeWhile(match => match.Success) 
    .Select(match => $"{match.Groups["code"].Value} {match.Groups["name"].Value}") 
    .ToArray(); // let's represent result as an array 

Test:

Console.Write(string.Join(Environment.NewLine, result)); 

Ergebnis:

10001 iTPM full self test 
10003 less than minimum required 
10004 bad tag value 
10005 bad param size 
10006 fail check 
+0

duhh .. OP bereits geschrieben erwartete Ausgabe –

+0

@Geoman Yabes: Ich sehe, tut mir leid für das falsche Format; Ich habe die Antwort bearbeitet –

1

Versuchen Sie mit unten Regex, Lookbehind aus Fehlercodes mit zwei Zeilenumbrüche.

(?<=Error codes:\n\n)[\w\s]+ 

RegexDemo

+0

Sieht gut aus, wird aber zerbrechen, wenn zum Beispiel ein Koma in der Zeichenkette –

+0

vorhanden ist. Sie können ',' in der übereinstimmenden Klasse oder einem beliebigen Zeichen hinzufügen, das Sie hinzufügen möchten. –

+0

Simply ['(? <= Fehlercodes: \ n \ n). *'] (Https://regex101.com/r/hVsXsQ/1) wird den Trick machen. Aber vergiss nicht, '/ s' Modifikator –

Verwandte Themen