Seite 1 von 1

ReplaceRegularExpression: Komma durch Punkt ersetzen

Verfasst: 20.07.2009 10:59
von Kiffi
[ächz] RegExp ist echt nicht mein Ding.

* Ich möchte alle Kommata in numerischen Werten durch Punkte ersetzen

Beispiel: 4,321 -> 4.321

Mein bisheriger Code...

Code: Alles auswählen

dummy.s = "lala 4,321 lulu, lölöl" ; das Komma hinter lulu soll nicht ersetzt werden

If CreateRegularExpression(0, "(\d),(\d)")
  Debug ReplaceRegularExpression(0, dummy, "$1.$2")
  FreeRegularExpression(0)
EndIf
... funktioniert leider nicht:
Debugger hat geschrieben:lala $1.$221 lulu, lölöl
Sollte $ nicht ein Platzhalter sein, wenn man es im Ersetzungsausdruck
angibt? In gängigen RegExp-Testern funktioniert es hingegen. Tickt PCRE
hier anders als andere RegExp-Parser?

Danke im voraus & Grüße ... Kiffi

Verfasst: 20.07.2009 11:59
von edel

Code: Alles auswählen

ImportC "" 
  pcre_exec(*pcre, *extra, subject.s, length, startoffset, options, *ovector, ovecsize)  
EndImport 

Procedure.s KommaSollWeg(subject.s)
  Protected string.s
  Protected Dim ovec(99) 
  Protected len,offset
  
  string = subject
  
  len = Len(string)
   
  regex = CreateRegularExpression(#PB_Any, "(\d+)(,)(\d+)")     
  
  While pcre_exec(PeekI(regex), 0, string, len, offset, 0, @ovec(), 99)>0 
    PokeC(@string + ovec(3),'.')  
    offset = ovec(1) 
  Wend   
  
  FreeRegularExpression(regex)
  
  ProcedureReturn string  
EndProcedure   

subject.s = "lala 4,321 lulu, lölöl" 

Debug KommaSollWeg(subject)

Verfasst: 20.07.2009 12:24
von Kiffi
@edel: Klasse! Funktioniert 1a :allright:

Schade nur, dass PB das nicht nativ kann. :|

Danke & Grüße ... Kiffi

Verfasst: 20.07.2009 19:57
von AND51
Ich bin öfter mal an weiteren PB-PCRE-Funktionen wie diese hier interessiert.
edel, kannst du (wenn du Zeit und Lust hast) vielleicht mal schreiben, wie ich alle Funktionen einbinden kann, welche es gibt und vielleicht grob, was die machen?
Toll fand ich ja schon immer die getSubString-Funktion. Aber ich wüsste nicht, wie ich die wo her importieren sollte.

Verfasst: 20.07.2009 21:57
von edel
die lib wird doch eh mit eingebunden und die funktionen und parameter bekommste aus der hilfe von pcre.

Verfasst: 20.07.2009 22:45
von marco2007
Das von Edel ist mir zu heavy.

Das hier wäre wohl nativ: :D

Code: Alles auswählen

dummy.s = "lala 4,321 lulu, lölöl, 2,1, 2,34" 
For i=0 To 9
  For j=0 To 9
    If CreateRegularExpression(0, "["+Str(i)+"],["+Str(j)+"]")
      dummy=ReplaceRegularExpression(0, dummy, Str(i)+"."+Str(j))
    FreeRegularExpression(0) 
    EndIf
  Next
Next

Debug dummy

Verfasst: 20.07.2009 23:36
von Little John
marco2007 hat geschrieben:Das von Edel ist mir zu heavy.

Das hier wäre wohl nativ: :D

Code: Alles auswählen

dummy.s = "lala 4,321 lulu, lölöl, 2,1, 2,34" 
For i=0 To 9
  For j=0 To 9
    If CreateRegularExpression(0, "["+Str(i)+"],["+Str(j)+"]")
      dummy=ReplaceRegularExpression(0, dummy, Str(i)+"."+Str(j))
    FreeRegularExpression(0) 
    EndIf
  Next
Next

Debug dummy
Dann würde ich es lieber ganz ohne Regular Expressions machen. :-)
=> Nach Komma suchen.
=> Wenn gefunden und beide Zeichen links und rechts davon Ziffern sind, dann durch Punkt ersetzen.
=> Nach nächstem Komma suchen.

Gruß, Little John

Verfasst: 20.07.2009 23:49
von marco2007
Little John hat geschrieben:Dann würde ich es lieber ganz ohne Regular Expressions machen. :-)
In diesem Fall sicher am Besten. Ich mag RegExp schon alleine wegen der Lizenz nicht. Ich wollte nur schauen, ob`s einen anderen Weg mit RegExp gibt. Ich verwende RegExp gar nicht, obwohl`s sicher `ne gute Sache wär/ist. Zwei Posts mit RegExp = alles, was ich bisher mit RegExp gemacht habe.