Mal wieder RegEx; jetzt Problem Telefonnummern

  • Guuude..

    Kurz und knapp... Ich muss mich zwingend mehr mit RegEx beschäftigen.
    Ich weiß es gibt auch super Tuts.. aber irgendwie komme ich nicht wirklich damit weiter.

    Ich würde gerne in meinem aktuellen Projekt Telefonnummer aus einem Text herausfiltern.
    Das Problem ist das die Nummer unterschiedlich aufgebaut sein können.

    Mein RegEx bis jetzt:

    [autoit]

    $array = StringRegExp($clipNow,'\d{3,5}\/\d{3,10}|\+49.\d{3,5}.\d{3,10}\-\d{1,5}',3 )

    [/autoit]

    Wie kann ich jetzt verschiedene Formate von Nummern kombinieren?
    Ich hatte es mal so probiert...

    [autoit]

    $array = StringRegExp($clipNow,'[0-9]{3,5}\/[0-9]{3,10}|\+49.[0-9]{3,5}.[0-9]{3,10}\-',3 )

    [/autoit]

    Aber das klappt auch nicht richtig...
    Vielleicht kann mir jemand mal einen Tipp / Lösungsansatz geben.
    Danke.

    MFG Chris :D

    • Offizieller Beitrag

    Übrigens fehlt dir eine auch in Deutschland verwendete Form der Rufnummern (Vanity-Rufnummern): "0180/0700/0800/0900 MEINEFIRMA" ;)
    Sinnvoll ist es zuerst die Rufnummern in mit RegExReplace zu bearbeiten, also alle nicht wählbaren Zeichen rauszuwerfen (Leerzeichen, Klammern, Bindestrich) und z.B. "+" durch "00" und Großbuchstaben durch die entsprechenden Ziffern der Telefontastatur zu ersetzen. Die dann erhaltene Rufnummer kannst du mit einem einfachen Pattern testen, da du ja jetzt alles nach einem Muster aufgebaut hast, nämlich nur noch Ziffern mit einer evtl führenden Doppelnull.
    Wobei dann für die Vanity-Nummern noch folgende Regeln zu beachten sind:
    0180 und 6 od. 7 Zeichen
    0700 und bis 8 Zeichen
    0800 und bis 7 Zeichen
    0900 und bis 6 Zeichen


    EDIT:
    Hier mal eine Lösung - aber erst gucken, wenn du gar nicht klar kommst. ;)

    Spoiler anzeigen
    [autoit]


    ;===============================================================================
    ; Function Name....: _ValidatePhoneNumber
    ; Author(s)........: BugFix ( [email='bugfix@autoit.de'][/email] )
    ;===============================================================================
    Func _ValidatePhoneNumber($_sNumber)
    $_sNumber = StringRegExpReplace($_sNumber, '\+', '00')
    $_sNumber = StringRegExpReplace($_sNumber, '(-|\s|\(|\)|/|\\)', '')
    If StringRegExp($_sNumber, '^0{0,2}(49)?(180[1-9]|700|800|900)[A-Z]+') Then ; Vanity-Number?
    ; Vorwahl und zugehörige Nummernlänge prüfen
    Local $aMatch = StringRegExp($_sNumber, '((?:180|700|800|900))[1-9]?([A-Z]+)', 1)
    Local $fReturn = 0, $iLen = StringLen($aMatch[1])
    Switch StringLeft($aMatch[0], 4)
    Case '180'
    If $iLen = 6 Then $fReturn = 1
    Case '700'
    If $iLen <= 8 Then $fReturn = 1
    Case '800'
    If $iLen <= 7 Then $fReturn = 1
    Case '900'
    If $iLen <= 6 Then $fReturn = 1
    EndSwitch
    Return $fReturn
    Else
    Return StringRegExp($_sNumber, '(^0{0,2})[1-9]\d+')
    EndIf
    EndFunc

    [/autoit]
  • Hi... vielen Dank erst einmal.
    Ich habe aber eins gefunden...

    [autoit]

    ConsoleWrite(_ValidatePhoneNumber("63172 Rodgau")&@CRLF)

    [/autoit]


    kommt 1 ?
    Man müsste im letzen return RegEx noch eine StringLen mit minimum 7 Stellen oder?
    Die kleinste Telefonnummer die ich kenne ist z.B. 069 1234
    Damit wären dann PLZ raus?

    EDIT: Jetzt verstehe ich ... du meintest das das Wort Rodgau eine Telefonnummer ergibt?
    Nein es sind nur reine Nummern!!!

    MFG chris :D

  • Hallo Bugfix,

    ich war mal so frei die Funktion von dir zu nutzen, allerdings bin ich mir jetzt nicht sicher ob ich die falsch verstehe, oder falsch anwende. Anbei mal das kleine Stückchen Code:

    Spoiler anzeigen
    [autoit]

    HotKeySet("!w", "_WritePhoneNumbr")
    HotKeySet("^!{ESC}", "_Exit")

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

    ;Tray-Menü anpassen
    Opt("TrayAutoPause", 0) ; Script will not be paused when clicking the tray icon.
    Opt("TrayOnEventMode", 1)
    Opt("TrayMenuMode", 1 + 2)
    $Version = "1.0.0"

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

    Global $Input, $Output

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

    While 1
    Sleep(100)
    WEnd

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

    Func _WritePhoneNumbr()
    $Input = ClipGet()
    ;~ $Output = $Input
    $Output = _ValidatePhoneNumber($Input)
    ;~ ConsoleWrite("Die neue Telefonnummer ist: " & $Output & @CRLF)
    MsgBox(0,"Die formatierte Telefonnummer ist:", $Output, 5)
    EndFunc ;==>_WritePhoneNumbr

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

    Func _Exit()
    Exit
    EndFunc ;==>_Exit

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

    ; Script Start - Add your code below here
    ;===============================================================================
    ; Function Name....: _ValidatePhoneNumber
    ; Author(s)........: BugFix ( [email='bugfix@autoit.de'][/email] )
    ;===============================================================================

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

    Func _ValidatePhoneNumber($_sNumber)
    $_sNumber = StringRegExpReplace($_sNumber, '\+', '00')
    $_sNumber = StringRegExpReplace($_sNumber, '(-|\s|\(|\)|/|\\)', '')
    If StringRegExp($_sNumber, '^0{0,2}(49)?(180[1-9]|700|800|900)[A-Z]+') Then ; Vanity-Number?
    ; Vorwahl und zugehörige Nummernlänge prüfen
    Local $aMatch = StringRegExp($_sNumber, '((?:180|700|800|900))[1-9]?([A-Z]+)', 1)
    Local $fReturn = 0, $iLen = StringLen($aMatch[1])
    Switch StringLeft($aMatch[0], 4)
    Case '180'
    If $iLen = 6 Then $fReturn = 1
    Case '700'
    If $iLen <= 8 Then $fReturn = 1
    Case '800'
    If $iLen <= 7 Then $fReturn = 1
    Case '900'
    If $iLen <= 6 Then $fReturn = 1
    EndSwitch
    Return $fReturn
    Else
    Return StringRegExp($_sNumber, '(^0{0,2})[1-9]\d+')
    EndIf
    EndFunc ;==>_ValidatePhoneNumber

    [/autoit]


    In Zeile 21 (MsgBox) bekomme ich als Ergebnis entweder eine 0 oder eine 1. Ich dachte ich erhalte hier eine formatierte Telefonnummer.
    Was muss ich den genau machen, damit ich die Nummer bekomme ?

    Gruß Hassan

    Nachtrag 17:03 Uhr: Ich habe es verstanden - mein Fehler!!!

    Einmal editiert, zuletzt von HassanMullah (8. Dezember 2014 um 17:03)