Zum Inhalt springen
View in the app

A better way to browse. Learn more.

Fachinformatiker.de

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

Empfohlene Antworten

Veröffentlicht

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

 

Gelöst von RipperFox

Zur Lösung

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.

Erstelle ein Konto oder melde dich an, um einen Kommentar zu schreiben.

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.