Zum Inhalt springen
  • 0

C# Regex Lookaround mehrere Zeilen


Frage

Geschrieben

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));
            }
        }
    }
}

 

6 Antworten auf diese Frage

Empfohlene Beiträge

  • 1
Geschrieben (bearbeitet)

@Tician

 

Mit RegexOptions.Singleline klappt schon mal mindestens Dein Beispielcode mit Deinem Beispieltext:

Regex r = new Regex("(?<=to:).+(?=T:)", RegexOptions.Singleline);

 

 

 

Bearbeitet von RipperFox
Tician statt Whiz-zarD war gemeint..
  • 1
Geschrieben

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.

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Diese Frage beantworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...