Ilja: Regulärer Ausdruck

yo,

gegeben ist eine variable CountryCode = 0049

jetzt will ich mit einem regulären ausdruck eine telefonummer fomratieren, dabei gelten folgende regeln:

1. wenn das erste zeichen der telefonnummer ein '+' zeichen ist, wird es durch die beiden zeichen '00' ersetzt.

2. alle zeichen entfernen, die keine zahlen sind.

3. wenn die ersten beiden zeichen nicht '00' entsprechen, dann concatiniere den CountryCode (0049) zur telefonnummer.

4. wenn das zeichen nach dem CountryCode (inmeinen beispiel das 5. zeichen), also das zeichen nach der länge des CountryCodes '0' ist, dann entferne die '0'

meine frage ist nun, ist das mit einem regulären ausdruck umzusetzten. was ich bisher habe sind punkte 1 und 2, dann komme ich aber nicht wirklich weiter. hier mein ausdruck:

REGEXP_REPLACE('+gsdfg&%/r353hfg0945', '(^+)?([[1]]+)', '00')

Ilja


  1. :digit: ↩︎

  1. Hello out there!

    jetzt will ich mit einem regulären ausdruck eine telefonummer fomratieren, dabei gelten folgende regeln:

    Ich glaube nicht daran, dass du alle Regeln in einem regulären Ausdruck unterbringen kannst. Möglich wäre für jede Regel ein gesonderter Ausdruck. Aber wozu?? Einfache Stringverarbeitung tut es in deinem Falle und dürfte deutlich performanter sein.

    1. alle zeichen entfernen, die keine zahlen sind.

    [lnk:http://de.wikipedia.org/wiki/Ziffer@title=Ziffern]. (Nicht „Zahlen“.)

    See ya up the road,
    Gunnar

    --
    „Und [dieses Forum] soll […] auch ein Fachforum bleiben und kein Psychologieforum werden.“ (Kirsten Evers)
    1. yo,

      danke auch dir für deine hilfe

      ILja

  2. echo $begrüßung;

    gegeben ist eine variable CountryCode = 0049
    jetzt will ich mit einem regulären ausdruck eine telefonummer fomratieren, dabei gelten folgende regeln:

    1. wenn das erste zeichen der telefonnummer ein '+' zeichen ist, wird es durch die beiden zeichen '00' ersetzt.
    2. alle zeichen entfernen, die keine zahlen sind.
    3. wenn die ersten beiden zeichen nicht '00' entsprechen, dann concatiniere den CountryCode (0049) zur telefonnummer.
    4. wenn das zeichen nach dem CountryCode (inmeinen beispiel das 5. zeichen), also das zeichen nach der länge des CountryCodes '0' ist, dann entferne die '0'

    Diese Regel ist übrigens nicht für alle Länder gültig.

    meine frage ist nun, ist das mit einem regulären ausdruck umzusetzten.

    Mit _einem_? Gar nicht mit dieser Oracle-Funktion, behaupte ich mal. Du hast mehrere Stellen, die unterschiedlich ersetzt werden sollen. Das geht nur dann mit einem Ausdruck, wenn der Gruppierungen zulässt und jede Gruppe einzeln behandeln kann.

    was ich bisher habe sind punkte 1 und 2, dann komme ich aber nicht wirklich weiter. hier mein ausdruck:
    REGEXP_REPLACE('+gsdfg&%/r353hfg0945', '(^+)?([[1]]+)', '00')

    Nein, hast du nicht, denn du hast in der Mitte Nullen eingeschoben.

    Ich denke, du kommst nicht drumrum für jede Regel eine eigene Behandlung zu verwenden. Kennt Oracle benutzerdefinierte Funktionen?

    echo "$verabschiedung $name";


    1. :digit: ↩︎

    1. yo,

      Diese Regel ist übrigens nicht für alle Länder gültig.

      könntst du mir beispiele nennen, wie das in anderen ländern geregelt wird ? das würde mir sehr helfen.

      Mit _einem_? Gar nicht mit dieser Oracle-Funktion, behaupte ich mal. Du hast mehrere Stellen, die unterschiedlich ersetzt werden sollen. Das geht nur dann mit einem Ausdruck, wenn der Gruppierungen zulässt und jede Gruppe einzeln behandeln kann.

      ich hatte gehofft, mit den jeweiligen pattern das abzufangen.

      Nein, hast du nicht, denn du hast in der Mitte Nullen eingeschoben.

      stimmt, es funktioniert noch nicht ganz so, wie es sein sollte.

      Ich denke, du kommst nicht drumrum für jede Regel eine eigene Behandlung zu verwenden. Kennt Oracle benutzerdefinierte Funktionen?

      wird wohl darauf hinaus laufen, ich wollte mir aber noch vorher rat holen, da ich mit regulären ausdrücken noch nicht all zuviel zu tun hatte.

      Ilja

      1. echo $begrüßung;

        Diese Regel ist übrigens nicht für alle Länder gültig.
        könntst du mir beispiele nennen, wie das in anderen ländern geregelt wird ? das würde mir sehr helfen.

        Ja, aber nur Beispiele. Wikipedia kennt eine Liste der internationalen Prefixe. Das ist zwar nicht die Ortsvorwahl-Null-Geschichte, aber ein Hinweis darauf, dass nicht überall die Doppel-Null für eine Auslandswahl vor den Landeskenner (bzw. anstelle des +) zu stellen ist.

        Aus eigener Erfahrung weiß ich nur, dass ich in Italien mein Ziel nur erreiche, wenn ich die Ortsvorwahl-Null mitwähle: Beispiel Padua von .de aus: 0039 049 ....
        Bei tschechischen Mobilfunknummern muss es wohl auch so sein.

        Man möge mich berichtigen und/oder ergänzen.

        echo "$verabschiedung $name";

        1. yo,

          danke für den Link. es ist eine grenzwärtige entscheidung, da sich der prafix nur ändert, wenn man sich auch in einem anderen land befindet und dann auch nur in speziellen. hier in deutschland und den meisten anderen ländern ist der präfix 00. aber sinnvoller wäre sicherlich das + zeichen zu benuten, dann ist man auf der sicheren seite.

          Ilja

      2. echo $begrüßung;

        Mit _einem_? Gar nicht mit dieser Oracle-Funktion, behaupte ich mal. Du hast mehrere Stellen, die unterschiedlich ersetzt werden sollen. Das geht nur dann mit einem Ausdruck, wenn der Gruppierungen zulässt und jede Gruppe einzeln behandeln kann.
        ich hatte gehofft, mit den jeweiligen pattern das abzufangen.

        Man kann im replace_string Referenzen auf die "subexpressions" angeben, also mit \n auf den n-ten geklammerten Ausdruck Bezug nehmen. Du möchtest bestimmte Zeichen wegschneiden, hast aber kein direktes Muster, dass nur umgebaut werden muss. Das heißt, deine ungewünschten Zeichen stehen überall zwischen den Nutzzeichen. Du kannst beispielsweise einen oder mehrere Buchstaben zwischen zwei Zifferngruppen entfernen, du kannst auf bestimmte Gruppen im Ersatzstring bezug nehmen, aber die Gruppe besteht immer auc nebeneinander liegenden Zeichen. Alle Ziffern, die beliebig verteilt zwischen anderen Zeichen rumliegen, lassen sich nicht mit einer Gruppierung erwischen.

        Ich denke, du kommst nicht drumrum für jede Regel eine eigene Behandlung zu verwenden. Kennt Oracle benutzerdefinierte Funktionen?
        wird wohl darauf hinaus laufen, ich wollte mir aber noch vorher rat holen, da ich mit regulären ausdrücken noch nicht all zuviel zu tun hatte.

        Du wirst mit einem Schritt alle Müllzeichen rauswerfen können. Du wirst aber nicht alle Regeln in einem (weiteren) Schritt abarbeiten können. Mit RegExp kann man Muster finden, die man mit einer Regel behandeln kann, aber RegExp sind nicht dafür gedacht, ein Regelwerk abzuarbeiten.

        echo "$verabschiedung $name";

        1. yo,

          nur zur Info, ich habe dann doch den klassischen weg genommen und eine funktion auf der datenbank erzeugt, die mir die formatierung vornimmt. war ein versuch, es mit regulären ausdrücken umzusetzen, aber die funktion war dann doch schneller erstellt und ist wohl auch perfomanter.

          Ilja