Code: Select all
StringCaseSense, On ;the StrReplace line must be case sensitive
vNeedle := "\Q" StrReplace(vNeedle, "\E", "\E\\E\Q") "\E"
;or alternatively (StringCaseSense not required):
vNeedle := "\Q" RegExReplace(vNeedle, "\\E", "\E\\E\Q") "\E"
Code: Select all
q:: ;simplest way to make a RegEx needle literal?
StringCaseSense, On ;the StrReplace line must be case sensitive
;vPfx := "i)"
vPfx := ""
vText := ""
Loop, 255
vText .= Chr(A_Index)
vNeedle := "\Q" StrReplace(vText, "\E", "\E\\E\Q") "\E"
vLenH := StrLen(vText), vLenN := StrLen(vNeedle)
MsgBox % "result: " RegExMatch(vText, vPfx "^" vNeedle "$") "`r`n" "haystack (length: " vLenH "):`r`n" vText "`r`n" "needle (length: " vLenN "):`r`n" vNeedle
vText := ""
Loop, 255
vText .= "\" Chr(A_Index)
vNeedle := "\Q" StrReplace(vText, "\E", "\E\\E\Q") "\E"
vLenH := StrLen(vText), vLenN := StrLen(vNeedle)
MsgBox % "result: " RegExMatch(vText, vPfx "^" vNeedle "$") "`r`n" "haystack (length: " vLenH "):`r`n" vText "`r`n" "needle (length: " vLenN "):`r`n" vNeedle
vText := ""
Loop, 255
vText .= "\\" Chr(A_Index)
vNeedle := "\Q" StrReplace(vText, "\E", "\E\\E\Q") "\E"
vLenH := StrLen(vText), vLenN := StrLen(vNeedle)
MsgBox % "result: " RegExMatch(vText, vPfx "^" vNeedle "$") "`r`n" "haystack (length: " vLenH "):`r`n" vText "`r`n" "needle (length: " vLenN "):`r`n" vNeedle
return
[EDIT:]
More fully (I believe these are correct, but RegEx is quite fiddly) (some things I might add to my RegEx tutorial):
Code: Select all
;LOOP APPROACH
;prepare literal text
Loop, Parse, % "\.*?+[{|()^$"
vNeedle := StrReplace(vNeedle, A_LoopField, "\" A_LoopField)
;prepare literal text but treat ? and * as wildcards
Loop, Parse, % "\.+[{|()^$" ;leave out ? and *
vNeedle := StrReplace(vNeedle, A_LoopField, "\" A_LoopField)
vNeedle := StrReplace(vNeedle, "?", ".")
vNeedle := StrReplace(vNeedle, "*", ".*")
;convert comma-separated list to pipe-separated list (to mimic 'if var in/contains')
Loop, Parse, % "\.*?+[{|()^$"
vNeedle := StrReplace(vNeedle, A_LoopField, "\" A_LoopField)
vNeedle := StrReplace(vNeedle, ",", "|")
;prepare pipe-separated list
Loop, Parse, % "\.*?+[{()^$" ;the pipe has been missed out in this case
vNeedle := StrReplace(vNeedle, A_LoopField, "\" A_LoopField)
;==================================================
;\Q AND \E APPROACH:
;prepare literal text
vNeedle := "\Q" RegExReplace(vNeedle, "\\E", "\E\\E\Q") "\E"
;prepare literal text but treat ? and * as wildcards
vNeedle := "\Q" RegExReplace(vNeedle, "\\E", "\E\\E\Q") "\E"
vNeedle := StrReplace(vNeedle, "?", "\E.\Q")
vNeedle := StrReplace(vNeedle, "*", "\E.*\Q")
;convert comma-separated list to pipe-separated list (to mimic 'if var in/contains')
vNeedle := "\Q" RegExReplace(vNeedle, "\\E", "\E\\E\Q") "\E"
vNeedle := StrReplace(vNeedle, ",", "\E|\Q")
;prepare pipe-separated list
vNeedle := "\Q" RegExReplace(vNeedle, "\\E", "\E\\E\Q") "\E"
vNeedle := StrReplace(vNeedle, "|", "\E|\Q")