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

Hallo zusammen,

mein Name ich Christian. Ich hänge gerade an folgendem Problem fest: Per OCR werden bestimmte Bereich in einem Dokument gescannt. Per RegEx sollen nun teile davon ausgelesen werden.

Der OCR Text lautet (zum Beispiel) wie folgt:

Bauvorhaben: HV Musterverwaltung - Projektbezeichnung B21-09498

Folgendes ist gegeben: das Wort "Bauvorhaben:" ist immer vorhanden und soll nicht übergeben werden.

Die Projektnummer "B21-09498" wird ebenfalls nicht benötigt. Diese ist aber Variabel und nach zwei Schemata aufgebaut: entweder "B" gefolgt von der Jahreszahl, Bindestrich und dann 5 Ziffern ODER "B" gefolgt von der Jahreszahl, KEIN Bindestrich und 6 Ziffern. Diese Projektnummer lese ich bereits für ein zweites Feld mit folgendem Ausdruck aus:

[B][0-9]{2}[-][0-9]{5}|[B][0-9]{8}

Das klappt wunderbar. Ich hänge nun, weil ich nicht weiß, wie ich die beiden beschriebenen Blöcke am Anfang und Ende aus der Suche ausschließe. Ich möchte lediglich den Bereich "HV Musterverwaltung - Projektbezeichnung" haben.

Bisher habe ich folgendes gemacht:

(?<=Bauvorhaben: ).*

Damit bekomme ich den gesamten String geliefert. Aber wie schließe ich nun die Projektnummer aus?

Vielleicht hab jemand von euch eine Idee.

Schönen Abend euch!

Gruß

Christian

PS Gibt es bei euch auch einen Bereich wo man sich Vorstellen darf?

 

vor 9 Stunden schrieb c77ar:

Aber wie schließe ich nun die Projektnummer aus?

(Folgender Vorschlag unter der Prämisse dass du ECMAScript regex verwendest)

Ich würde es mit einer non-capturing group machen: 
(Bauvorhaben\:.*)(?:B\d{2}-\d{5})


Der fett markierte Teil ist die Syntax für eine non-capturing group. Damit bekommst als subexpression match nur den vorderen String.

Bearbeitet von blaargh

Moin,

steht die Projektnummer immer am Ende? Dann kannst du einfach alles hintereinander wegschreiben.

^Bauvorhaben: (?<ergebnis>.*)(?>B\d{2}-\d{5}|B\d{8})$

Wenn die Projektnummer irgendwo im Text vorkommen kann, würde ich nachsehen welche Möglichkeiten du hast um den Text zu bearbeiten. Anstatt einen komplizierten großen Regex draufzujagen, könntest du evtl. mit 2 einfachen die Projektnummer entfernen.

 

vor 9 Stunden schrieb c77ar:

PS Gibt es bei euch auch einen Bereich wo man sich Vorstellen darf?

Sure!

 

vor 10 Stunden schrieb c77ar:

Vielleicht hab jemand von euch eine Idee.

Alternativ splittest du den String und ignorierst den ersten und den letzten Teil des Arrays.

vor 13 Stunden schrieb blaargh:

(Bauvorhaben\:.*)(?:B\d{2}-\d{5})

Damit bekommt man aber zwei matches für group 0 und group 1? und in beiden steht auch "Bauvorhaben", was ja nicht im Ergebnis stehen sollte.

vor 13 Stunden schrieb PVoss:
^Bauvorhaben: (?<ergebnis>.*)(?>B\d{2}-\d{5}|B\d{8})$

mit lookahead und lookbehind Groups spart man sich die capture Group für das gewünscht Ergebnis und bekommt nur ein einzelnes Match auf den gewünschten Teilstring.

Da wir ja schon Lösungen posten ...

(?<=Bauvorhaben: ).*(?=B\d{2}-\d{5}|B\d{8})

 

vor 9 Stunden schrieb _n4p_:

Damit bekommt man aber zwei matches für group 0 und group 1? und in beiden steht auch "Bauvorhaben", was ja nicht im Ergebnis stehen sollte.

Den Teil habe ich überlesen, ist aber auch trivial zu ergänzen: (?:BAUVORHABEN\:)(.*)(?:B\d{2}-\d{5}). Und joa, du bekommst dann zwei Matches, unter anderem eben auch ein Subexpression Match mit dem gewünschten String. Lookbehind wird von std::regex in C++ zum Beispiel nicht supported, subexpression matches funktionieren auch Jahre zurück in so gut wie jeder regex engine.

  • 4 Wochen später...
  • Autor

Hallo Leute,

sorry dass ich mich jetzt erst melde! Ich hatte leider einen familiären Zwischenfall der mich voll in Beschlag nahm.

Vielen Dank für eure Hilfe in dieser Sache!

Liebe Grüße

Christian

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.