通常在我的AutoHotkey脚本中,我需要将变量与多个值值进行比较
if (myString == "val1" || myString == "val2" || myString == "val3" || myString == "val4")
; Do stuff
在大多数语言中,有一些方法可以使这种比较更简洁。
爪哇
if (myString.matches("val1|val2|val3"))
// Do stuff
的Python
if myString in ["val1","val2","val3","val4"]
# Do stuff
AutoHotkey有类似的东西吗?是否有更好的方法将变量与多个字符串进行比较?
答案 0 :(得分:2)
许多不同的方式。
Autohotkey方式(if Var in MatchList)
if myString in val1,val2,val3,val4
与基于java regex的方式类似
if (RegExMatch(myString, "val1|val2|val3|val4"))
类似于你的python,虽然不是基于关联数组的好方法
if ({val1:1,val2:1,val3:1,val4:1}.hasKey(myString))
答案 1 :(得分:0)
; If-Var-In way. Case-insensitive.
Ext := "txt"
If Ext In txt,jpg,png
MsgBox,,, % "Foo"
; RegEx way. Case-insensitive. To make it case-sensitive, remove i).
Ext := "txt"
If (RegExMatch(Ext, "i)^(?:txt|jpg|png)$"))
MsgBox,,, % "Foo"
; Array way 1. Array ways are case-insensitive.
Ext := "txt"
If ({txt: 1, jpg: 1, png: 1}.HasKey(Ext))
MsgBox,,, % "Foo"
; Array way 2.
Extensions := {txt: 1, jpg: 1, png: 1}
Ext := "txt"
If (Extensions[Ext])
MsgBox,,, % "Foo"
If-Var-In是最原始的方法。但是,您应该意识到它不是一个表达式,因此它不能成为另一个表达式的一部分。
损坏:
SomeCondition := True
Extension := "exe"
If (SomeCondition && Extension In "txt,jpg,png")
MsgBox,,, % "Foo"
Else
MsgBox,,, % "Bar"
正常工作:
SomeCondition := True
Extension := "exe"
If (SomeCondition && RegExMatch(Extension, "i)^(?:txt|jpg|png)$"))
MsgBox,,, % "Foo"
Else
MsgBox,,, % "Bar"
出于相同的原因(即因为它不是表达式),您不能使用K&R大括号样式。
正常工作:
Ext := "txt"
If Ext In txt,jpg,png
MsgBox,,, % "Foo"
Ext := "txt"
If Ext In txt,jpg,png
{
MsgBox,,, % "Foo"
}
损坏:
Ext := "txt"
If Ext In txt,jpg,png {
MsgBox,,, % "Foo"
}