Code: Select all
;e.g.
;MsgBox, % JEE_StrCloneCase("yellow", "RED")
;MsgBox, % JEE_StrCloneCase("yellow", "Red")
JEE_StrCloneCase(vText, vCaseTemplate)
{
local vCase,vOutput
if (vCaseTemplate = "")
return vText
Loop, Parse, vCaseTemplate
{
vCase := (Format("{:L}", A_LoopField) == A_LoopField) ? "L" : "U"
vOutput .= Format("{:" vCase "}", SubStr(vText, A_Index, 1))
}
vOutput .= Format("{:" vCase "}", SubStr(vText, StrLen(vCaseTemplate)+1))
return vOutput
}
;==================================================
;e.g.
;MsgBox, % JEE_StrReplaceMaintainCase("ABC,Abc,abc,aBc,abC", "abc", "def")
;MsgBox, % JEE_StrReplaceMaintainCase("ABC,Abc,abc,aBc,abC", "abc", "defgh")
JEE_StrReplaceMaintainCase(vText, vNeedle, vReplaceText:="", ByRef vCount:=0, vLimit:=-1)
{
local oPos,oReplace,vDiff,vNeedle2,vOffset,vOutput,vPos,vSCS
vCount := 0
if (vNeedle = "") || (vNeedle = vReplaceText)
return
vSCS := A_StringCaseSense
StringCaseSense, Off
if (vReplaceText = "")
{
vOutput := StrReplace(vText, vNeedle, "", vCount, vLimit)
StringCaseSense, % vSCS
return vOutput
}
vPos := 1, oPos := {}, oReplace := {}
Loop
{
if !(vLimit = -1) && (A_Index > vLimit)
break
vPos := InStr(vText, vNeedle, 0, vPos)
if !vPos
break
oPos.Push(vPos)
vNeedle2 := SubStr(vText, vPos, StrLen(vNeedle))
oReplace.Push("" JEE_StrCloneCase(vReplaceText, vNeedle2))
vPos += StrLen(vNeedle)
}
vOutput := StrReplace(vText, vNeedle, vReplaceText, vCount, vLimit)
vDiff := StrLen(vReplaceText) - StrLen(vNeedle)
Loop, % oPos.Length()
{
vOffset := (oPos[A_Index] + (A_Index-1)*vDiff - 1) * (A_IsUnicode?2:1)
StrPut(oReplace[A_Index], &vOutput+vOffset, StrLen(vReplaceText))
}
StringCaseSense, % vSCS
return vOutput
}
Code: Select all
q::
vText := "ABC,Abc,abc,aBc,abC"
vNeedle := "abc"
vReplaceText := "def"
MsgBox, % JEE_StrReplaceMaintainCase(vText, vNeedle, vReplaceText, vCount) " " vCount
vReplaceText := "def"
MsgBox, % JEE_StrReplaceMaintainCase(vText, vNeedle, vReplaceText, vCount, 3) " " vCount
vReplaceText := "def"
MsgBox, % JEE_StrReplaceMaintainCase(vText, vNeedle, vReplaceText)
vReplaceText := "defgh"
MsgBox, % JEE_StrReplaceMaintainCase(vText, vNeedle, vReplaceText)
vReplaceText := "de"
MsgBox, % JEE_StrReplaceMaintainCase(vText, vNeedle, vReplaceText)
vReplaceText := "d"
MsgBox, % JEE_StrReplaceMaintainCase(vText, vNeedle, vReplaceText)
return