none
REGEX - Positive Lookbehind + ignorieren aller Leerzeichen + Auslesen eines Betrags RRS feed

  • Frage

  • Hallo zusammen,

    ich stehe gerade vor der Aufgabe für ein DMS mit REGEX einen Betrag auszulesen, der nach etlichen Leerzeichen kommt.

    Sieht so aus:

    Zwischensumme                                           345.00 

    Mit dem Befehl hier kann ich das gesamte nach "Zwischensumme" schon auslesen:

    (?<=Zwischensumme)\s*(\d{1,8}[\.]\d{2})

    hinderlich sind aber die gesamten Leerzeichen, die die OCR mit ausliest. Es muss doch eine Möglichkeit geben, den Betrag hier ohne die Leerzeichen auszulesen.

    Danke für Eure Hilfe im Voraus.

    Gruß Marcel

    Freitag, 13. Juli 2018 09:53

Alle Antworten

  • Hallo Marcel,

    versuche mal dieses Pattern:

    (?<=Zwischensumme\s*)(\d{1,8}[\.]\d{2})

    Du betrachtest ja mit dem Lockbehind nur noch den Teil nach der Bedingung, also nimmst Du die Leerzeichen mit in die Bedingung, und es bleibt nur noch der Betrag übrig.

    Grüße

    Roland




    Freitag, 13. Juli 2018 12:58
  • Hi, wie immer führen viele Wege nach Rom.

    Hier noch mein Vorschlag (mit einem kleinen Konsolen-Test):

    string[] txtArr = 
    	{
    	"Zwischensumme                                           345.00 ",
    	"Zwischensumme                           345.00 ",
    	"Zwischen                                     345.00 ",
    	"Zwischensumme                                           345.00     ",
    	"Zwischensumme                                           345.00",
    	"Zwischensumme                              345.00   ",
    	"Zwischensumme345.00 "
    };
    
    string re1 = "(Zwischensumme)"; 
    string re2 = ".*?"; 
    string re3 = "([+-]?\\d*\\.\\d+)(?![-+0-9\\.])"; 
    
    Regex r = new Regex(re1 + re2 + re3, RegexOptions.IgnoreCase | RegexOptions.Singleline);
    
    foreach (var txt in txtArr)
    {
    	Match m = r.Match(txt);
    	if (m.Success)
    	{
    		String word1 = m.Groups[1].ToString();
    		String float1 = m.Groups[2].ToString();
    		Console.Write("(" + word1.ToString() + ")" + "(" + float1.ToString() + ")" + "\n");
    	}
    }
    Gruß


    Freiberufler im Bereich Softwareentwicklung Von der PLC und Robotik zu VB.NET & C#, vorrangig WPF und UWP

    Freitag, 13. Juli 2018 13:23
  • Hallo Roland,

    scheint leider nicht zu funktionieren.

    Ich habe irgendwie das Gefühl, dass das Programm keine Groups akzeptiert ...

    Gibt es vielleicht noch eine andere Möglichkeit das abzubilden?

    Gruß Marcel

    Freitag, 13. Juli 2018 13:48
  • Hallo Marcel,

    wenn meinst Du mit scheint leider nicht zu funktionieren?

    Mein Pattern habe ich mit jeder beliebigen Kombination von Inputstrings getestet.

    Als Ergebnis wurde immer 345.00 geliefert.

    Oder habe ich Deine Frage falsch verstanden?

    Ich kann auch gerne mal ein Beispielprogramm einstellen.

    Grüße

    Roland

    Freitag, 13. Juli 2018 13:58
  • Hallo Roland,

    ich glaube eher, dass die Software, in der ich das versuche (ein DMS) REGEX nicht vollumfänglich unterstützt ...

    Ich habe meine Lösungsansätze auch in allen Kombis, die ich heute so gefunden habe, getestet.

    Gruß Marcel

    Freitag, 13. Juli 2018 14:05
  • Anhand Deiner Beschreibung im ersten Post hat aber Dein angegebenes Pattern genau das richtige Ergebniss geliefert.

    Hier mal das Testprogramm in C#

    // Drei Beispiele:
    
    Console.WriteLine( Regex.Match(@"Zwischensumme    345.00", @"(?<=Zwischensumme\s*)(\d{1,8}[\.]\d{2})").Value);
    Console.WriteLine(Regex.Match(@"Zwischensumme345.00", @"(?<=Zwischensumme\s*)(\d{1,8}[\.]\d{2})").Value);
    Console.WriteLine(Regex.Match(@"xx Zwischensumme    345.00", @"(?<=Zwischensumme\s*)(\d{1,8}[\.]\d{2})").Value);
    			
    			
    Console.Read();
    
    Was kommt den bei Deinem Programm mit meinem Pattern als Ergebnis?

    Freitag, 13. Juli 2018 14:10