Code: Select all
ReplacedStr := StrReplace(Haystack, SearchText [, ReplaceText, OutputVarCount, Limit := -1], Reverse := 0)
Thanks!
Addendum:
Also, an option to skip the first X matches would work.
Code: Select all
ReplacedStr := StrReplace(Haystack, SearchText [, ReplaceText, OutputVarCount, Limit := -1], Reverse := 0)
Code: Select all
q:: ;replace last occurrence of string (see notes about escape characters lower down)
vText := "ABCDEF_ABCDEF_ABCDEF"
MsgBox, % RegExReplace(vText, "E(?!.*E)")
MsgBox, % RegExReplace(vText, "CDE(?!.*CDE)")
return
;note: use 'i)' for a case-insensitive replace
;Regular Expressions (RegEx) - Quick Reference | AutoHotkey
;https://autohotkey.com/docs/misc/RegEx-QuickRef.htm
;note: see here for details on escaping characters
;simplest way to make a RegEx needle literal? - AutoHotkey Community
;https://autohotkey.com/boards/viewtopic.php?f=5&t=30420
;12 characters that need escaping in RegEx generally: \.*?+[{|()^$
;4 characters that need escaping in a RegEx character class: ^-]\
;==================================================
w:: ;replace last occurrence of string (AHK v1)
vText := "ABCDEF_ABCDEF_ABCDEF"
vNeedle := "E"
vPos := InStr(vText, vNeedle, 1, 0, 1)
MsgBox, % RegExReplace(vText, ".{" StrLen(vNeedle) "}", "",, 1, vPos)
vNeedle := "CDE"
vPos := InStr(vText, vNeedle, 1, 0, 1)
MsgBox, % RegExReplace(vText, ".{" StrLen(vNeedle) "}", "",, 1, vPos)
return
;==================================================
e:: ;replace last occurrence of string (two-way compatible)
vIsV1 := !!InStr(1,1,1,0)
vText := "ABCDEF_ABCDEF_ABCDEF"
vNeedle := "E"
vPos := InStr(vText, vNeedle, 1, vIsV1?0:-1, 1)
MsgBox, % RegExReplace(vText, ".{" StrLen(vNeedle) "}", "",, 1, vPos)
vText := "ABCDEF_ABCDEF_ABCDEF"
vNeedle := "CDE"
vPos := InStr(vText, vNeedle, 1, vIsV1?0:-1, 1)
MsgBox, % RegExReplace(vText, ".{" StrLen(vNeedle) "}", "",, 1, vPos)
return
Code: Select all
;before:
ReplacedStr := StrReplace(Haystack, SearchText [, ReplaceText, OutputVarCount, Limit := -1])
;after (add StartingPosition and CaseSensitive):
ReplacedStr := StrReplace(Haystack, SearchText [, ReplaceText, OutputVarCount, Limit := -1, StartingPosition := 1, CaseSensitive := false])
Code: Select all
;possible new look:
;vRet := StrReplace("ABCabc", "a", "",,, 1) ;HNR CL C (haystack/needle/replace text, count/limit, case sen.)
;vRet := StrReplace("ABCabc", "a", "",,,, 1) ;HNR CLS C (haystack/needle/replace text, count/limit/start pos., case sen.)
;replace last 2 occurrences of 'DEF'
;without a StartingPos parameter
vIsV1 := !!InStr(1,1,1,0)
vText := "ABCDEF_ABCDEF_ABCDEF"
vNeedle := "DEF"
vPos := InStr(vText, vNeedle, 1, vIsV1?0:-1, 2)
vOutput := SubStr(vText, 1, vPos-1) StrReplace(SubStr(vText, vPos), vNeedle)
MsgBox, % vOutput
;replace case sensitive
;without a CaseSensitive parameter
vText := "ABCabc"
vSCS := A_StringCaseSense
StringCaseSense, On
vOutput := StrReplace(vText, "a")
StringCaseSense, % vSCS
MsgBox, % vOutput
Some times parameters really stress me out, so I use objects instead!jeeswg wrote:I don't see multiple commas as a big problem, one multiple comma example in the StrReplace documentation would fix this.
Code: Select all
f()
f({CaseSense: "On"})
f({StartPos: "10"})
f({Reverse: "On"})
f({CaseSense: "On", StartPos: "10", Reverse: "On"})
F(Options := "") ;__________________ Function ________________
{
msgbox, % ""
. "CaseSense = " Options["CaseSense"] "`n"
. "StartPos = " Options["StartPos"] "`n"
. "Reverse = " Options["Reverse"] "`n"
}
Code: Select all
InputBox, vInput,, % vPrompt
InputBox, vInput,, % vPrompt,,,,,,,, % vDefault
InputBox, vInput,, % vPrompt,, % vPosW, % vPosH,,,, % vTimeout, % vDefault
InputBox, vInput,, % vPrompt,, % vPosW, % vPosH, % vPosX, % vPosY,, % vTimeout, % vDefault
InputBox, vInput, % vTitle, % vPrompt,, % vPosW, % vPosH, % vPosX, % vPosY,, % vTimeout, % vDefault
For me that's really not suitable, in that example of yours, "pos" and "cs" variable from the script would be modified! (Example below)jeeswg wrote:vRet := StrReplace("ABCabc", "a", "",,, pos:=-4, cs:=1)
Code: Select all
test := F()
msgbox, % test " - " Options
test := F("Sript")
msgbox, % test " - " Options
test := F(Options := "Sript") ;not suitable ("Options" variable from sccript will be modified)
msgbox, % test " - " Options
f(Options := "Default") ;_____________ function __________
{
return, Options
}
I don't want to start a new syntax convention, I just suggested a simple solution to add several new parameters to existing functions!jeeswg wrote:I wouldn't start a new syntax convention ...
Code: Select all
q:: ;test StrReplaceNew
;replace last 2 occurrences of 'DEF'
vIsV1 := InStr(1, 1,, 0)
vText := "ABCDEF_ABCDEF_ABCDEF"
vNeedle := "DEF"
vPos := InStr(vText, vNeedle, 1, vIsV1?0:-1, 2)
MsgBox, % StrReplaceNew(vText, vNeedle,,,, vPos)
;replace 4th-to-last and 3rd-to-last occurrences of 'DEF'
vIsV1 := InStr(1, 1,, 0)
vText := "ABCDEF_ABCDEF_ABCDEF_ABCDEF_ABCDEF_ABCDEF_ABCDEF_ABCDEF"
vNeedle := "DEF"
vPos := InStr(vText, vNeedle, 1, vIsV1?0:-1, 4)
MsgBox, % StrReplaceNew(vText, vNeedle,,, 2, vPos)
vText := "ABCabc"
vNeedle := "a"
MsgBox, % StrReplaceNew(vText, vNeedle,,,,, 1)
MsgBox, % StrReplaceNew(vText, vNeedle,,,,, 0)
return
StrReplaceNew(vText, vNeedle, vReplaceText:="", ByRef vCount:=0, vLimit:=-1, vStartPos:=1, vCaseSen:="")
{
local
if !(vCaseSen = "")
{
vSCS := A_StringCaseSense
if (vCaseSen = 1) || (vCaseSen = 0)
StringCaseSense, % vCaseSen ? "On" : "Off"
else
StringCaseSense, % vCaseSen
}
if (vStartPos = 1)
vRet := StrReplace(vText, vNeedle, vReplaceText, vCount, vLimit)
else
vRet := SubStr(vText, 1, vStartPos-1) StrReplace(SubStr(vText, vStartPos), vNeedle, vReplaceText, vCount, vLimit)
if !(vCaseSen = "")
StringCaseSense, % vSCS
return vRet
}
Code: Select all
;handy templates:
;common
vText := StrReplace(vText, vNeedle, vReplaceText)
;all
vText := StrReplace(vText, vNeedle, vReplaceText, vCount, vLimit, vStartPos, vCaseSen)
;common + 1
vText := StrReplace(vText, vNeedle, vReplaceText, vCount)
vText := StrReplace(vText, vNeedle, vReplaceText,, vLimit)
vText := StrReplace(vText, vNeedle, vReplaceText,,, vStartPos)
vText := StrReplace(vText, vNeedle, vReplaceText,,,, vCaseSen)
Users browsing this forum: No registered users and 2 guests