Frage zu Regex

  • Hi Leute, bin nicht so der RegExperte darum meine Frage.

    Wenn ich folgenden String habe :
    Vorname | Nachname | Strasse | Hausnr | PLZ | Ort | Teilort
    Martin Mustermann SeeYoustr. 4 12323 Wurstwo Egalheim

    Wie müsste ich diesen zerlegen wenn evtl. noch folgende Umstände dazu kommen könnten.

    Zwischen Vor und Nachname ein 2t Name, evtl. auch kein Teilort oder aber der Nachname ist evtl. Müller-Mailer aber da unter Umständen getrennt oder eben auch nicht.
    Es könnte auch sein, das die Strasse so geschrieben wurde.
    SeeYou Str. 4
    Was wiederum auch ein Problem geben könnte :(

    ????

    Mir fällt dafür keine Lösung ein, aber ich muss diese Daten zerlegen und entsprechend in die Datenbank schieben.

    Kann mir da wer Helfen ?

    Könnte unter Umständen auch sein das ich danach noch ein Paar RegEx Fragen habe :(

    Thx
    MfG
    Obs

    2 Mal editiert, zuletzt von Observer (16. Juni 2013 um 18:24) aus folgendem Grund: Wegen unsinniger Fragestellung :(

  • Hi,

    Zitat von Observer

    bin nicht so der RegExperte

    muss man auch nicht sein, die "normalen" Stringbefehle reichen dafür aus.
    Diese haben nämlich den großen Vorteil, dass man die auch von dir beschriebenen "Ausnahmen"

    Zitat

    Zwischen Vor und Nachname ein 2t Name, evtl. auch kein Teilort oder aber der Nachname ist evtl. Müller-Mailer aber da unter Umständen getrennt oder eben auch nicht.
    Es könnte auch sein, das die Strasse so geschrieben wurde.
    SeeYou Str. 4

    recht einfach abfangen kann.
    Wenn das RegEx bei einer der Ausnahmen abschmiert oder unerwartete Ergebnisse liefert, dann schaust du nämlich in die Röhre. Oder willst du bei jeder "Ausnahme" hier einen der RegEx´er anhauen, dass er dir die Abfrage umschreibt oder erweitert?
    Btw. wie kommst du zu dem String

    Code
    Martin Mustermann SeeYoustr. 4 12323 Wurstwo Egalheim

    . Allein dafür gehört schon jemand geprügelt, und das meine ich nicht zum Spass! JEDES (und wenn es noch so alt ist) Adressdaten-Programm hat die Möglichkeit, entweder nach CSV oder einem anderen Stringformat mit Trennzeichen zu exportieren...
    Denn um bspw. das hier

    Code
    Vorname | Nachname | Strasse | Hausnr | PLZ | Ort | Teilort

    aufzudröseln, brauchts kein RegEx, sondern nur ein simples

    [autoit]

    StringSplit()

    [/autoit]
  • Hi danke für deine Antwort schonmal.

    Also zu dem String komme ich weil ich eine PDF Auslese und dort die Adressdaten in der Form da stehen.
    Diese PDF kann ich leider nicht beeinflussen, da ich diese Geliefert bekomme.

    Das was du so im ganzen sagtest, ist vollkommen richtig.
    Ich habe das auch schon befürchtet :(

    Werde dann wohl die einzelnen Zeilen in einzelne Arrays packen und dort nach verschiedenen Kriterien auseinanderdrösseln.
    Dies wiederum werde ich in einzelne Comboboxen hauen und dort den Anzunehmenden Wert Vorselektieren.
    Sollte dieser Wert nicht Korrekt sein kann der User da dann immerhin noch einen anderen Wert wählen oder den Korrekten eben von Hand eintragen.

    So sollte es dann gehen denke ich.

    Vorname | Nachname | Strasse | Hausnr | PLZ | Ort | Teilort
    Sollte die Vorgabe sein in der die Daten dann abgelegt werden.
    So kommen diese dann in die DB.

    Dort wiederum ist es dann eine Saubere Ablage und kann Ordentlich abgearbeitet werden.

    MfG
    Obs

  • Code
    Martin Mustermann SeeYoustr. 4 12323 Wurstwo Egalheim


    Nur weil der String so angeordnet ist und nicht so

    Code
    Vorname | Nachname | Strasse | Hausnr | PLZ | Ort | Teilort


    heißt das nicht das man

    [autoit]

    StringSplit

    [/autoit]


    nicht benutzen kann ;)
    Entweder du benutzt erst ein

    [autoit]

    StringReplace

    [/autoit]


    und Tauschst alle Leerzeichen durch ein - oder / oder | aus oder du machst es direkt mit dem

    [autoit]

    StringSplit

    [/autoit]


    der kann auch an Leerzeichen Splitten ;)

  • Ich würde den String trennen an der Postleitzahl, das sind 5 Ziffern und das ist das einzig sichere in deinem String.
    Und dann weiter aufdröseln...so bspw:

    Spoiler anzeigen
    [autoit]

    #include <Array.au3>

    [/autoit] [autoit][/autoit] [autoit]

    ;$Adressen=fileread("Adressen.txt")
    $Adressen = " Martin Mustermann SeeYoustr. 4 12323 Wurstwo Egalheim " & @CRLF & _
    "Ulf Müller Lüdenscheid Im Talgrund 11b 23456 Bad Münster am Stein" & @CRLF & _
    "Dr.Dr. Hannes Klöbner Badewannenstrasse12 45678 Entenhausen im Breisgau" & @CRLF & _
    "Fritz Freiherr von Hohenlohe Fürstenstr.55 99999 Adelshausen an der Weinstrasse" & @CRLF & _
    "Marlene Jaschke Vogelsangstraße 112a-114b 01234 Piepenhausen"

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    $adresszeilen = StringSplit($Adressen, @CRLF, 3)

    [/autoit] [autoit][/autoit] [autoit]

    For $zeile In $adresszeilen

    [/autoit] [autoit][/autoit] [autoit]

    $zeile = StringStripWS($zeile, 7) ;führende, folgende und doppelte Leerzeichen entfernen
    $a = StringRegExp($zeile, "(.*)(\d{5})(.*)", 3) ;splitten an PLZ

    [/autoit] [autoit][/autoit] [autoit]

    ; _ArrayDisplay($a)

    [/autoit] [autoit][/autoit] [autoit]

    $NameStrasse = $a[0]
    $plz = $a[1]
    $Ort = $a[2]

    [/autoit] [autoit][/autoit] [autoit]

    ;Orte splitten
    $orte = StringSplit(StringStripWS($Ort,7), " ", 3)
    ; _ArrayDisplay($orte)
    $teilort = ""

    [/autoit] [autoit][/autoit] [autoit]

    Switch UBound($orte) ;Anzahl Wörter im Ort
    Case 1
    $Ort = $orte[0]
    Case 2
    $Ort = $orte[0]
    $teilort = $orte[1]
    Case 3 - 10
    $Ort = ""
    For $i = 1 To UBound($orte)
    $Ort &= $orte[$i]
    Next
    EndSwitch

    [/autoit] [autoit][/autoit] [autoit]

    ;Namen und Strasse splitten
    $NameStrasse_split = StringRegExp($NameStrasse, "(.*?)(\d{1}.*)", 3) ;alles ab der ersten Ziffer^^
    $Hausnummer = $NameStrasse_split[1]
    $Name_Strasse = $NameStrasse_split[0]
    ;nur selbst fressen macht fett!
    ;viel spass dabei^^....

    [/autoit] [autoit][/autoit] [autoit]

    $adressstring="Name und Strasse:"&@TAB&$Name_Strasse&@crlf& _
    "Hausnummer "&@TAB&$Hausnummer&@crlf& _
    "PLZ "&@TAB&$plz &@crlf& _
    "Ort "&@TAB&$Ort&@crlf& _
    "Teilort "&@TAB&$teilort

    [/autoit] [autoit][/autoit] [autoit]

    Msgbox(0,"Adressen",$Adressstring)

    [/autoit] [autoit][/autoit] [autoit]

    Next

    [/autoit]
  • Danke, hab es schon gelöst.
    Wie du sagtest, habe ich mit StringSplit das ganze gemacht und dann Sauber Ausgelesen.
    Deckt mir jetzt so zimlich alle Fälle ab die ich bisher hatte.

    Muss mich jetzt nur noch mit GUI und dem erstellen mehrerer GUIs widmen.

    MfG
    Obs