Hilfe bei RegEx

  • Hallo,

    Ich bräuchte mal wieder Hilfe bei ner RegEx-Definition. Ich hab einen String der Straßenname und Hausnummer enthält und ich möchte den gern teilen so dass ich nachher die Straße und die Hausnummer in zwei verschiedenen Variablen hab.

    Als Beispielstring gebe ich hier mal die "Größsächsenheimerstr. 20" an.

    [autoit]


    $String="Großsachsenheimerstr. 20"
    $Straße=StringRegExp($String,"([A-z]{1,30})",2)
    $Hausnummer=StringRegExp($String,"([0-9]{1,5})",2)
    MsgBox(0,"",$Straße[1]&" "&$Hausnummer[1])

    [/autoit]

    Leider habe ich Probleme mit Umlauten und "ß" und die fixe Definition von 1-30 Chars gefällt mir auch nicht so richtig.
    Lieber wäre mir: Alle Zahlen = Hausnummer und alle Chars=Straßenname

    Edit: Hab gerade gesehen das mein Straßennamenpool auch Straßennamen mit Bindestrich enthalten z.B.:
    "Wilhelm-Zapf-Str. 26"

    Edit: Hat sich erledigt, werde die Strings mit StringSplit am "." trennen und spar das ganze Patternbasteln

    MFG

    Einmal editiert, zuletzt von Cerverus (28. Oktober 2010 um 10:56)

  • StringSplit($String, " ") reicht nicht aus oder?

    Übrigens ist das ß in Variablennamen nicht erlaubt.

    • Offizieller Beitrag

    Das ist gar nicht so ohne, es gibt auch folgende Straßennamen:
    "1. Umgehungsstraße 112"
    "Peter Lustig Ufer 85 b"
    usw.
    Ein einfaches Splitten reicht da nicht und für das RegExen muß man ebenso das Ende des Straßennamens finden.

    Edit:
    Mit folgendem Pattern solltest du eigentlich alle gängigen Straßennamenvarianten abdecken können

    Code
    ([a-zA-Z0-9. -ßäöüÄÖÜ]+)(?:\s)(\d+\s?\w?)


    Falls Worte wie "Charité" o.ä. auftauchen können, mußte die Group um diese Werte erweitern.

  • Ich hab es mal auf konventionelle Weise gemacht, sind natürlich ein paar mehr Zeilen Code. :P
    Will ja nicht das RegEx überhand nimmt.

    Spoiler anzeigen
    [autoit]

    #include <Array.au3>

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

    Global $aSource[7] = ["1. Umgehungsstraße 112", "Peter Lustig Ufer 85 b", _
    "Elsternhag 29/1", "Kleestr. 8/9", "Kirchröder Str. 89/90", _
    "Nobelring 10-12", "Anna-von-Borries-Str. 1-7"]
    Global $aResult[UBound($aSource)][2]
    Global $iIndexNumber, $sNumber, $iIndexStreet, $sStreet

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

    _ArrayDisplay($aSource, "Vorher")

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

    For $i = 0 To UBound($aSource) - 1
    $aStrSplit = StringSplit($aSource[$i], " ")
    $iIndexNumber = $aStrSplit[0] + 1
    $iIndexStreet = 0
    $sNumber = ""
    $sStreet = ""
    Do
    $iIndexNumber -= 1
    $sNumber = $aStrSplit[$iIndexNumber] & " " & $sNumber
    $sNumber = StringStripWS($sNumber, 2)
    Until Not StringIsAlpha($sNumber)
    $aResult[$i][1] = $sNumber
    Do
    $iIndexStreet += 1
    $sStreet &= $aStrSplit[$iIndexStreet] & " "
    Until $iIndexStreet = $iIndexNumber - 1
    $sStreet = StringStripWS($sStreet, 2)
    $aResult[$i][0] = $sStreet
    Next

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

    _ArrayDisplay($aResult, "Nachher")

    [/autoit]
  • Guten Morgen,

    RegExen sind gierig (greedy). Deshalb sollte für die bisher bekannten Straße&Hausnummer-Mutationen auch die reichen:

    [autoit]

    #include <Array.au3>
    Global $aSource[8] = ["1. Umgehungsstraße 112", "Peter Lustig Ufer 85 b", _
    "Elsternhag 29/1", "Kleestr. 8/9", "Kirchröder Str. 89/90", _
    "Nobelring 10-12", "Anna-von-Borries-Str. 1-7", "Straße 231 56"]
    Global $aResult[UBound($aSource)][2]
    _ArrayDisplay($aSource, "Vorher")
    For $i = 0 To UBound($aSource) - 1
    $aRegEx = StringRegExp($aSource[$i], "(.+)\s+(\d+.*)", 1)
    $aResult[$i][0] = $aRegEx[0]
    $aResult[$i][1] = $aRegEx[1]
    Next
    _ArrayDisplay($aResult, "Nachher")

    [/autoit]