Regex, das Zahlen in einem String mit Punktierung versieht bzw. Punktierung modifiziert..

  • Ok, ich habe folgendes als beipielhafte Ausgangssituation, das ganze ist immer ein String, der eben mit Text und Zahlen sowie ein paar anderen Zeichen wie folgt befüllt ist:

    17: TEXTTEXTTEXT 45646 46456 1873897.37 66.11% 9874 2234212.02 10.11%

    Die erste Zahl kann einstellig oder zweistellig sein und ist immer von einem Doppelpunkt gefolgt, also 1:, 7:, 12:, 17: usw. Der zweite Teil ist immer ein Text beliebiger Länge. Dann folgen zwei natürliche Zahlen, dann eine Kommazahl, eine Prozentzahl, noch eine natürliche Zahl, wieder gefolgt von einer Kommazahl und einer Prozentzahl. Delimiter sind immer Whitespaces!

    Nun möchte ich die Punktkommata durch Beistrichkommata ersetzen, und Tausenderpunktierungen einführen, sodaß das Ganze beispielhaft so aussieht (farblich und durch Fettdruck hervorgehoben):

    17: TEXTTEXTTEXT 45.646 46.456 1.873.897,37 66,11% 9.874 2.234.212,02 10,11%

    Sprache meiner Wahl ist Perl, das ganze kann in einer Variable stehen, z.B. in der Variable $teststring, und ich würde das gern in einem Regex wie z.B. $teststring =~ s/blubb/neuesblubb/g; erledigen. Bin irgendwie zu blöd, um das zusammenzubringen, vielleicht kann da ja jemand behilflich sein.

    Edit: Ajo, natürlich wäre auch eine Schleife denkbar, die $teststring nach Whitespace-Delimitern in einzelne Elemente splittet, und dann elementweise abarbeitet (also so, daß immer nur eine einzelne Zahl betrachtet und modifiziert wird), falls das einfacher ist...

    Danke! :)

    1-6000-banner-88x31-jpg

    Stolzer Besitzer eines 3dfx Voodoo5 6000 AGP Prototypen:

    • 3dfx Voodoo5 6000 AGP HiNT Rev.A-3700

    [//wp.xin.at] - No RISC, no fun!

    QotY: Girls Love, BEST Love; 2018 - Lo and behold, for it is the third Coming; The third great Year of Yuri, citric as it may be! Edit: 2019 wasn't too bad either... Edit: 2020... holy crap, we're on a roll here~♡!

    Quote Bier.jpg@IRC 2020: "Je schlimmer der Fetisch, desto besser!"

    5 Mal editiert, zuletzt von GrandAdmiralThrawn (21. Oktober 2009 um 11:12)

  • an deiner stelle würde ich die funktionalität aufspalten, anstatt es in einem rutsch zu erledigen. also zuerst den gesamten string ähnlich eines lexers einlesen, um so an die zu ändernden bestandteile zu kommen. dann kannst du dich ja mit jedem teil einzeln beschäftigen und per regexp transformieren. so entfällt der aufwändige pattern-matching-teil.

  • Stimmt, hast recht, das geht viel einfacher... Zuerst alle Teile in einen Array, dann durchlaufen. Die Zahlen kann man von hinten nach vorne durchgehen, Nachkommateil zuerst truncen, dann immer drei Stellen in die Zahl reinzählen, und einen Tausenderpunkt setzen, solange bis End of String. Danach den Nachkommateil wieder appenden und die korrekte Kommapunktierung setzen.

    Bei einem Match auf "%" kann man die Tausenderpunktierung gleich überspringen...

    Wollte unbedingt auf den gesamten String matchen, aber das issn Blödsinn. Also wirds halt iterativ. ;):rolleyes:

    1-6000-banner-88x31-jpg

    Stolzer Besitzer eines 3dfx Voodoo5 6000 AGP Prototypen:

    • 3dfx Voodoo5 6000 AGP HiNT Rev.A-3700

    [//wp.xin.at] - No RISC, no fun!

    QotY: Girls Love, BEST Love; 2018 - Lo and behold, for it is the third Coming; The third great Year of Yuri, citric as it may be! Edit: 2019 wasn't too bad either... Edit: 2020... holy crap, we're on a roll here~♡!

    Quote Bier.jpg@IRC 2020: "Je schlimmer der Fetisch, desto besser!"

  • So, Doppelpost, yay!

    Das mit dem Truncen war umsonst, ging dreckiger und schneller auch. ;) Na jedenfalls konnte ich den Code jetzt erfolgreich bauen, und es funktioniert! War also genau der richtige Ansatz, das Problem so elementar wie möglich, und nicht "global" zu behandeln.

    Aaah, viel dreckiger Perl Code, wunderbar, aber er tut was er soll! :rolleyes::D

    1-6000-banner-88x31-jpg

    Stolzer Besitzer eines 3dfx Voodoo5 6000 AGP Prototypen:

    • 3dfx Voodoo5 6000 AGP HiNT Rev.A-3700

    [//wp.xin.at] - No RISC, no fun!

    QotY: Girls Love, BEST Love; 2018 - Lo and behold, for it is the third Coming; The third great Year of Yuri, citric as it may be! Edit: 2019 wasn't too bad either... Edit: 2020... holy crap, we're on a roll here~♡!

    Quote Bier.jpg@IRC 2020: "Je schlimmer der Fetisch, desto besser!"