将变量与 Autohotkey 中的多个字符串进行比较

Comparing a variable to multiple strings in Autohotkey

通常在我的 AutoHotkey 脚本中,我需要将一个变量与多个值进行比较

if (myString == "val1" || myString == "val2" || myString == "val3" || myString == "val4")
    ; Do stuff

在大多数语言中,都有一些方法可以使这种比较更加简洁。

Java

if (myString.matches("val1|val2|val3"))
    // Do stuff

Python

if myString in ["val1","val2","val3","val4"]
    # Do stuff

AutoHotkey 有类似的东西吗?有没有更好的方法来比较一个变量和多个字符串?

许多不同的方式。

  • Autohotkey 方式(if Var in MatchList)

    if myString in val1,val2,val3,val4
    
  • 类似于您的 java 基于正则表达式的方式

    if (RegExMatch(myString, "val1|val2|val3|val4"))
    
  • 与您的 python 类似,但不是基于关联数组的好方法

    if ({val1:1,val2:1,val3:1,val4:1}.hasKey(myString))
    
; 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"
}