Veröffentlicht 16. September 20168 j Hallöööchen mit 3 öchen, ich habe Probleme mit Regex und finde es sehr schwierig da etwas zu finden. Ich habe in C# eine string-Variable mit nem Haufen Text drin und die ist (zumindest laut Consolen-Ausgabe) auch mit Zeilen formatiert und sollte so bleiben. Jetzt versuche ich mit Regex nur einen Ausschnitt aus dem ganzen Text zu bekommen. Über eine Zeile funktioniert mit dem Syntax: (?<=to:).+(?=T:) Heißt hätte ich die Zeile blato: 123 abc T: bla Würde ich den Output 123 abc bekommen. Jetzt sieht mein Text aber als Beispiel so aus: blato: 123 abc T: lalala und ich möchte trotzdem nur 123 abc als Ausgabe haben. Was muss ich an der Syntax ändern damit die Suche über mehrere Zeilen geht? Mein Code sieht momentan komplett so aus: using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using iTextSharp.text.pdf; using iTextSharp.text.pdf.parser; using System.Text.RegularExpressions; namespace ReadPDF { class Program { static void Main(string[] args) { try { var text = new StringBuilder(); var currentText = ""; //get all text from pdf using (var pdfReader = new PdfReader("C:\\Temp\\example.pdf")) { for (var page = 1; page <= pdfReader.NumberOfPages; page++) { ITextExtractionStrategy strategy = new SimpleTextExtractionStrategy(); currentText = PdfTextExtractor.GetTextFromPage(pdfReader, page, strategy); currentText = Encoding.UTF8.GetString(Encoding.Convert(Encoding.Default, Encoding.UTF8, Encoding.Default.GetBytes(currentText))); text.Append(currentText); } } Console.WriteLine(currentText); //Show me the text from the pdf-file Console.WriteLine(""); string newtext = Convert.ToString(currentText); //needed for Regex //get what I need Regex r = new Regex("(?<=to:).+(?=T:)"); //??? Match m = r.Match(newtext); if(m.Success == true) { Console.WriteLine(m); } Console.ReadKey(); } catch (Exception ex) { Console.WriteLine(Convert.ToString(ex)); } } } }
16. September 20168 j Dein Code ist schon recht komplex. Ein Problem hierbei ist schon, dass NewLine-Steuerkommando Systemabhängig ist. Unter Windows \r\n ist standardmäßig und unter Linux ist der Standard \n. Das lässt sich aber konfigurieren. Das .Net-Framework bietet hierzu die Enviroment.NewLine Konstante, die das aktuelle Newline-Kommando zurückliefert. Ich würde im ersten Schritt alle Text-Steuerkommandos entfernen: s = Regex.Replace(s, @"\t|\n|\r", " "); Dann würde ich den String in ein Array aufteilen: var array1 = s.Split(new[] { ' ' }, StringSplitOptions.RemoveEmptyEntries); Dann würde ich die beiden relevanten Ergebnisse extrahieren: var s2 = s1.Skip(Array.FindIndex(s1, x => x.ToLower() == "blato:") + 1).Take(2); und zum Schluss würde ich dann die Ergebnisse in ein String joinen: var result = string.Join(" ", s2); Und schon hat man mit vier Zeilen Code das Ergebnis und das ohne großartig reguläre Ausdrücke zu benutzen. Ich versuche sowieso reguläre Ausdrücke zu meiden, weil diese eh keine Sau versteht. Der gesamte Code: s = Regex.Replace(s, @"\t|\n|\r", " "); var s1 = s.Split(new[] { ' ' }, StringSplitOptions.RemoveEmptyEntries); var s2 = s1.Skip(Array.FindIndex(s1, x => x.ToLower() == "blato:") + 1).Take(2); var result = string.Join(" ", s2); Ist jetzt von der Variablenbenennung beschissen, aber ich hoffe, du kannst damit was anfangen.
17. September 20168 j Kopiere dir die Ausgabe und nutze einen online Regextester. So siehst du ob dein Regex wie gewünscht funktioniert.
17. September 20168 j vor 2 Stunden schrieb Guybrush Threepwood: Naja dann kannst du auch einfach Substring benutzen Mmh, okay. Ich bin eher davon ausgegangen, dass er den string noch weiter analysieren wollte.
19. September 20168 j Lösung @Tician Mit RegexOptions.Singleline klappt schon mal mindestens Dein Beispielcode mit Deinem Beispieltext: Regex r = new Regex("(?<=to:).+(?=T:)", RegexOptions.Singleline); Bearbeitet 19. September 20168 j von RipperFox Tician statt Whiz-zarD war gemeint..
19. September 20168 j Autor @RipperFox Ja genau das sieht perfekt aus, ich hatte es am Wochenende dann auch gefunden http://stackoverflow.com/questions/4654006/how-to-completely-ignore-linebreak-and-tab-in-regex Werde es später (wenn ich dazu komme) ausprobieren, vielen Dank an alle!
Erstelle ein Konto oder melde dich an, um einen Kommentar zu schreiben.