Seite 1 von 1

String Replace Callback

Verfasst: 21.01.2018 20:10
von Taz
Hallo zusammen, ich habe erst vor ein paar Tagen angefangen mit PureBasic zu programmieren, also bitte nicht direkt die Keule schwingen wenn ich was dummes fragen sollte :roll:

Ich hab vorher viel mit AutoIt gearbeitet, und für mich eine sehr nützliche und sehr oft angewendet Funktion geschrieben um Sprach Strings zu formatieren. Eine art preg_replace_callback (PHP)
Hier erst einmal die Funktion in AutoIt:

Code: Alles auswählen

Func _StringF($sFormat, $v1=Default, $v2='', $v3='', $v4='', $v5='', $vn=@CRLF) 
	#forceref $v1, $v2, $v3, $v4, $v5, $vn
	Return ($v1 = Default) ? StringReplace($sFormat, "%n", $vn, 0, 1) : Execute("'" & StringRegExpReplace(StringReplace($sFormat, "'", "''", 0, 1), "%([1-5n]{1})", "'&$v\1&'") & "'")
EndFunc
Und das Beispiel:

Code: Alles auswählen

Global $String = 'Programm %1 löschen?%n%nDie folgenden Verzeichnisse werden gelöscht:%n- "%4"%n- "%3"%n- "%2"'
Global $String_2 = _StringF($String, 'ProgrammXYZ', 'Ordner\ABC', 'Ordner\DEF', 'Ordner\XYZ')

ConsoleWrite($String_2)
String_2 ist nun:

Code: Alles auswählen

Programm ProgrammXYZ löschen?

Die folgenden Verzeichnisse werden gelöscht:
- "Ordner\XYZ"
- "Ordner\DEF"
- "Ordner\ABC"
Wie bekomm ich das Ganze in PB umgesetzt? Weiß im Moment echt nicht weiter. Hoffe ihr könnt mir weiterhelfen :)

Re: String Replace Callback

Verfasst: 21.01.2018 20:57
von mk-soft
Bekommt man bestimmt mit Purebasic auch wieder so hin.

- ReplaceString(...)
- CreateRegularExpression(...)

Vielleicht geht es mit mein Format(...) {like sprintf} einfacher.

Link: http://www.purebasic.fr/english/viewtop ... 12&t=32026

Re: String Replace Callback

Verfasst: 21.01.2018 21:24
von Mijikai
Vielleicht hilft das :)

Code: Alles auswählen

;PB 5.61

DeclareModule EXT
  Declare.s Get(Buffer.s,SigStart.s,SigEnd.s,NoCase.b,Offset.i)
  Declare.i Offset()
EndDeclareModule

Module EXT
  
  Global LastOffset.i
  
  Procedure.s Get(Buffer.s,SigStart.s,SigEnd.s,NoCase.b,Offset.i)
    Protected PosStart.i
    Protected PosEnd.i
    If Offset < 0
      Offset = LastOffset
    EndIf
    LastOffset = 0
    PosStart = FindString(Buffer,SigStart,Offset,NoCase)
    If PosStart
      Offset = PosStart + Len(SigStart) 
      PosEnd = FindString(Buffer,SigEnd,Offset,NoCase)
      If PosEnd
        LastOffset = PosEnd + Len(SigEnd)
        ProcedureReturn Mid(Buffer,Offset,PosEnd - Offset)
      EndIf
    EndIf
  EndProcedure
  
  Procedure.i Offset()
    ProcedureReturn LastOffset
  EndProcedure
  
EndModule

Str1.s = "'Programm %1 löschen?%n%nDie folgenden Verzeichnisse werden gelöscht:%n- " + 
         Chr(43) + "%4" + Chr(43) + "%n- " + Chr(43) + "%2" + Chr(43) + "'"
Str2.s = "_StringF($String, 'ProgrammXYZ', 'Ordner\ABC', 'Ordner\DEF', 'Ordner\XYZ')"

Debug EXT::Get(Str1,"%n%n","%",#False,#Null)
Debug EXT::Get(Str2,"'","'",#False,#Null)
Debug EXT::Get(Str2,"'","'",#False,-1)
Debug EXT::Get(Str2,"'","'",#False,-1)

Re: String Replace Callback

Verfasst: 21.01.2018 23:38
von Taz
@Mijikai
mh, irgendwie kommt da was anderes bei raus :?:

@mk-soft
Format string with some values like sprintf (C) - Update
sieht sehr intersannt aus, nur leider für mich als Anfänger verdammt schwer zu verstehen der code :o
habs jetzt ersteinmal mit ReplaceString(...) gemacht:

Code: Alles auswählen

Procedure.s _StringF(String.s, v1.s="", v2.s="", v3.s="", v4.s="", v5.s="")
	Protected Str.s = String

	ReplaceString(Str, "'", #DQUOTE$, #PB_String_InPlace)
	ReplaceString(Str, "%n", #CRLF$, #PB_String_InPlace)

	If v1 <> ""
		Str = ReplaceString(Str, "%1", v1)
		If v2 <> ""
			Str = ReplaceString(Str, "%2", v2)
			If v3 <> ""
				Str = ReplaceString(Str, "%3", v3)
				If v4 <> ""
					Str = ReplaceString(Str, "%4", v4)
					If v5 <> ""
						Str = ReplaceString(Str, "%5", v5)
					EndIf
				EndIf
			EndIf
		EndIf
	EndIf

	ProcedureReturn Str
EndProcedure

Define Text.s = "Programm '%1' löschen?%n%nDie folgenden Verzeichnisse werden von %1 gelöscht:%n- '%4'%n- '%3'%n- '%5'%n%n" +
                  "Bedenke wenn du '%1' löscht%nfunktioniert '%2' nicht mehr."
Debug _StringF(Text, "ProgrammXYZ", "App X", "Ordner\A", "Ordner\B", "Ordner\C")
Ergebnis:

Code: Alles auswählen

Programm "ProgrammXYZ" löschen?

Die folgenden Verzeichnisse werden von ProgrammXYZ gelöscht:
- "Ordner\B"
- "Ordner\A"
- "Ordner\C"

Bedenke wenn du "ProgrammXYZ" löscht
funktioniert "App X" nicht mehr.
:!: ABER ich hab mir auch ReplaceRegularExpression angeschaut, ich bin ja fast vom Stuhl gefallen als ich gelesen habe:
Rückverweise (englisch "back references", meist als \1, \2, etc. beschrieben) werden nicht unterstützt
:shock: ähm... ja.. wie jetzt? :o
Somit ist ja quasi gar keine RegExReplace funtion verfügbar? Und schon gar nicht ein RegExReplace mit Callback Funktionalität :shock:
Oder habe ich da ihrgentwas übersehen?

Re: String Replace Callback

Verfasst: 21.01.2018 23:41
von STARGÅTE
Taz hat geschrieben:Somit ist ja quasi gar keine RegExReplace funtion verfügbar? Und schon gar nicht ein RegExReplace mit Callback Funktionalität Oder habe ich da ihrgentwas übersehen?
Das ist richtig.
Darum hatte ich selbst so eine Routine geschrieben:
Regex - Lizensfreies Include für reguläre Ausdrücke (Beta)
Dort kann man sowohl einen Callback übergeben, als auch in diesem auf verschiedene Back references zugreifen.

Re: String Replace Callback

Verfasst: 22.01.2018 00:02
von Taz
Danke, werde ich mir direkt mal anschauen :allright:
...
...
...
WOW, 1200 Zeilen Code, Respekt.

PS: Weiß zufällig jemand ob die Entwickler von PB planen eine Funktion mit "back references", und callback Funktionalität, zu Implementieren?