String Replace Callback

Für allgemeine Fragen zur Programmierung mit PureBasic.
Taz
Beiträge: 27
Registriert: 20.01.2018 18:24
Wohnort: NRW

String Replace Callback

Beitrag 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 :)
Benutzeravatar
mk-soft
Beiträge: 3695
Registriert: 24.11.2004 13:12
Wohnort: Germany

Re: String Replace Callback

Beitrag 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
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Benutzeravatar
Mijikai
Beiträge: 754
Registriert: 25.09.2016 01:42

Re: String Replace Callback

Beitrag 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)
Taz
Beiträge: 27
Registriert: 20.01.2018 18:24
Wohnort: NRW

Re: String Replace Callback

Beitrag 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?
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 6996
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: String Replace Callback

Beitrag 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.
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Taz
Beiträge: 27
Registriert: 20.01.2018 18:24
Wohnort: NRW

Re: String Replace Callback

Beitrag 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?
Antworten