seth: Punkt gegen Komma tauschen mit Nebenbedingungen

Beitrag lesen

gudn tach Uwe!

mir ist noch was eingefallen: "\G" wird hier gar nicht mehr benoetigt, weil vermoege "?!" ja mit _zero_-_length_ gematcht wird.
Aha. Ich habe mir die Funktion von "\G" angeschaut und mich gefragt, wofür das in diesem konkreten Fall notwendig ist.

das "\G" waere (u.u.) notwendig gewesen, wenn man den hinteren teil nicht mit zero-length (sondern z.b. mit "?:") matcht, denn bei "1.0 2.0" wuerde dann zunaechst "1.0 " (mit dem abschliessenden leerzeichen!) gematcht und anschliessend aber nicht "2.0", weil "2" weder am zeilenanfang noch ein zeichen davor steht.

Aber jetzt weiß ich, wie ich die Suche an einer Stelle fortsetzen kann.

;-)

Ich habe mir meine Datenstruktur noch einmal genau angeschaut und festgestellt, dass vor und nach der Zahlen/Punk(e)-Folgen niemals ein Punkt oder Komma steht.

ok, dann kommt also sowas wie "das erste ergebnis ist 1.0, das zweite 2.0." nie vor. dann wird's (wegen dem punkt ".") noch ein wenig leichter, weil man dann nicht pruefen muss, ob danach eine ziffer kommt.

Daher habe ich deine Lösung etwas abgewandelt und benutze jetzt folgendes:
$test=~ s/((?:[^\d,.])\d+)\.(\d+)(?!\d|\.\d)/$1,$2/g;
Funktioniert einwandfrei und macht genau dass, was es soll.

vorsicht! wegen dem (?:[^\d,.]) _muss_ nun vor jeder zahl ein zeichen stehen. wenn also ein string mit einer zahl beginnt, z.b. "1.0 ...", dann wird ihr punkt nicht ersetzt.
geschickter ist also evtl.
$test=~s/(?<![\d,.])(\d+)\.(\d+)(?![\d,.])/$1,$2/g;

prost
seth