Ich habe vor kurzem über reguläre Ausdrücke gelernt. Ich versuche, FDF-Objekte in einzelne Strings zu sammeln, die ich dann parsen kann. Das Problem, das ich habe, ist, dass mein Code nur dem ersten Vorkommen entspricht und alle anderen "Objekte" in der FDF-Datei ignoriert werden.C# Regex passt nicht mehrmals
Objekte beginnen in einer eigenen Zeile mit 2 Zahlen und der Zeichenfolge "obj" und dann einem Wagenrücklauf (kein Zeilenvorschub). Sie enden nach einem Wagenrücklauf und der Zeichenfolge "endobj".
//testing parsing into objects...
List<String> FDFobjects = new List<String>();
String strRegex = @"^(?<obj>\d+ \d+) obj\r(?<objData>.+?)\rendobj(?=\r)";
Regex useRegex = new Regex(strRegex, RegexOptions.Multiline | RegexOptions.Singleline);
StreamReader reader = new StreamReader(FileName);
String fdfString = reader.ReadToEnd();
reader.Close();
foreach (Match useMatch in useRegex.Matches(fdfString))
FDFobjects.Add(useMatch.Groups["objData"].Value);
if (FDFobjects.Count > 0)
Console.WriteLine(FDFobjects[0]);
Console.WriteLine(FDFobjects.Count);
(Ich war mit $ am Ende des Regex Zeichenfolge, aber das entspricht 0 mal, während mit (= \ r) paßt einmal?).
Edit: Einige Zeilenumbrüche sind CR/LF, und einige sind nur CR. Ich weiß nicht, ob es für die verschiedenen Teile der Datei immer konsistent ist, also überprüfe ich einfach auf alle. Ich habe mich auf das Folgende festgelegt, das bisher perfekt funktioniert (und ich verwende die Multiline-Option nicht). Das Hinzufügen der Blick hinter ist, was der größte Unterschied hier gemacht ....
... = new Regex(@"(?<=^|[^\\](\r\n|\r|\n))(?<objName>\d+ \d+) obj(\r\n|\r|\n)(?<objData>.*?)(?<!\\)(\r\n|\r|\n)endobj(?=\r\n|\r|\n|$)", RegexOptions.Singleline);
Try '@ "^ (? \ d + \ d +) obj \ r? \ N (? . +?) \ R? \ Nendobj (? = \ R? \ N)"'. Vielleicht kann es helfen, '\ r' zu einem flexibleren' \ r? \ N' zu ändern. Ohne einen genauen Beispielstring ist es nicht einfach, Ihnen bei diesem Muster zu helfen. –
@Wiktor: Danke. Es funktioniert nicht. Das FDF verwendet nur Wagenrücklauf nur, es scheint. – someprogrammer
Geben Sie dann die genaue Eingabezeichenfolge mit exakt erwarteter Ausgabe an. –