Gerd: RegExp: Ziffernfolge zerteilen

Hallo,

Hilfe, ich komm nicht weiter !

Ich habe einen langen Ziffernstring, eine Aneinanderreihung von
jeweils 3 Ziffern, z.B. "647837552663748", d.h.,
"647", "837", "552", "663", und "748" sind ohne Trennung
aneinandergereiht.

Ich möchte nun mit einem regulären Ausdruck diese Folge
splitten und ein Trennzeichen einfügen, so daß ein String in
der Form "647-837-552-663-748" entsteht.

Wie knack ich die Nuß (für Experten doch sicher ein Kinderspiel,
oder ? :-)))

Vielen Dank und lieben Gruß
Gerd.

  1. Hallo Gerd,

    Ich möchte nun mit einem regulären Ausdruck diese Folge
    splitten und ein Trennzeichen einfügen, so daß ein String in
    der Form "647-837-552-663-748" entsteht.

    Zuallererst: Ich habe es geschafft, mich bis gerade noch nie mit Regulären
    Ausdrücken zu beschäftigen. Hätte ich Dein Problem gehabt, ich hätte eine
    Methode geschrieben, die einen String bekommt, ein Sicherheitsabfrage macht,
    ob denn die Anzahl der Zeichen in der Zeichenkette ein Vielfaches von drei
    ist und wäre dann mit einer Schleife zeichenweise den String durchgegangen
    und alle drei Zeichen ein Minuszeichen eingefügt. Uuuumständlich.

    Gottseidank hat Deine Anfrage mich endlich mal dazu gebracht, mir zumindest
    die Grundlagen für Reguläre Ausdrücke anzugucken. In diesem Fall auf dieser
    Seite in SELFHTML.

    http://selfhtml.teamone.de/cgiperl/sprache/regexpr.htm

    Aufgrund dieses bischen Wissens will ich nun mal versuchen, Dein Problem
    aufzudröseln. Einfach, um dadurch selber etwas zu lernen. Echte Experten
    mögen bitte dazwischenschreien, wenn ich dann doch was flashc mache.

    Suchen und ersetzen findet in Perl mit Regulären Ausdrücken so statt:

    $Zeichenkette =~ s/Suchmuster/Ersatzzeichenkette/[Flags]

    Als Flag dürfte hier das "g" verwendet werden, da ich global in der
    Zeichenkette suchen will.

    Meine Idee für das Suchmuster ist jetzt, nach drei aufeinanderfolgenden
    Zahlen zu suchen und dann als Ersatzzeichenkette die drei Zeichen plus
    dem Minuszeichen auszugeben.

    Das Suchmuster für eine Zahl ist einfach, entweder /[0-9]/ oder /\d/.
    Erstere Variante ist mir optisch sympathischer, also behalte ich diese
    mal bei.

    Um nach drei Zahlen zu suchen ist das Suchmuster folglich also /[0-9][0-9][0-9]/ oder mit Wiederholungangabe /[0-9]{3}/.

    Ich will die gefundene Teilzeichenkette von drei Zeichen aber in der
    Ersatzzeichenkette weiterverwenden. Also muß ich sie einklammern, damit
    das auch klar ist: /([0-9]{3})/

    Nun zur Ersatzzeichenkette. Ich will die Teilzeichenkette aus dem Suchmuster
    wieder ausgeben und dann ein Minuszeichen anfügen. Auf die Teilzeichenkette
    habe ich mit der Variablen $1 Zugriff. So wie ich das sehe, muß das
    Minuszeichen nicht maskiert werden, kann also so an die Variable
    angefügt werden: /$1-/

    So komme ich dann zu diesem vollständigen Ausdruck...

    s/([0-9]{3})/$1-/g

    ... und erwarte nun eine positive oder eine Negative Rückmeldung von Dir
    oder anderen Experten. Ich bin noch unsicher, ob mein in 10 Minuten
    angelesenes Wissen und der schnell dahingedengeltes Ausdruck wirklich
    stimmt.

    Ein Problem sehe ich noch. Ich weiß nicht genau, was Du mit diesem Ausdruck
    und der entstehenden Zeichenkette anfangen willst. Wenn die anfängliche
    Zeichenkette kein Vielfaches von drei ist, dann können eventuell Probleme
    für Dich entstehen.

    Ich setze einfach mal voraus, daß der Suche- und Ersetze-Ausdruck die
    Zeichenkette von vorne nach hinten durchläuft. Bei einer Zeichenkette, die
    kein Vielfaches von drei ist, können dann am Ende Zeichen übrigbleiben, die
    eben kein Dreierblock sind. Zum Beispiel
    ...-567-8
    ...-567-89

    Ich weiß nicht, ob das für Dich wichtig ist, aber eventuell solltest Du
    eine Sicherheitsabfrage einkalkulieren.

    • Tim
  2. Hallo Gerd,

    Ich möchte nun mit einem regulären Ausdruck diese Folge
    splitten und ein Trennzeichen einfügen, so daß ein String in
    der Form "647-837-552-663-748" entsteht.

    Du kannst es auch ohne RegEx lösen:

    my $str = "1234567890";
    my $laenge = length($str);
    for(my $a = 0; $a < $laenge; $a=$a+3) {
      $add = substr($str, $a, 3);
      push(@splitted, $add);
    }
    $new_str = join("-", @splitted);

    (Gestestet, funktioniert)

    Wie knack ich die Nuß (für Experten doch sicher ein Kinderspiel,
    oder ? :-)))

    Ich bin kein Experte, sonst könnte ich das vielleicht mit regulären Ausdrücken lösen ;-)

    mfg Torsten

    --
    Opinions are like assholes: everybody has one.
    ss:| zu:| ls:# fo:| de:[ va:| ch:? n4:& rl:? br:& js:| ie:% fl:( mo:}
  3. Hallo,

    dank Euch, klappt super.

    Vor allem Tim hat sich ja mächtig ins Zeug gelegt und hat
    jetzt ein "Buch mit sieben Siegeln" (RegExp !) weniger im Regal.

    Viel Spaß noch damit, ich verwende die Dinger oft, komme
    nur immer wieder mal einfach nicht auf den Trichter und
    frage dann hier nach.

    Gruß Gerd.

    1. Hallo Gerd,

      dank Euch, klappt super.

      Das freut mich.

      Vor allem Tim hat sich ja mächtig ins Zeug gelegt und hat
      jetzt ein "Buch mit sieben Siegeln" (RegExp !) weniger im Regal.

      Oh ja. Perl ist jetzt dadurch auf meiner Liste der Dinge, mit denen ich
      mich unbedingt beschäftigen will, nach ziemlich weit oben gerutscht.
      Und ich frage mich noch immer, wie ich so lange so blind auf diesem Auge
      sein konnte. Danke! ;o)

      • Tim