【问题标题】:Comparing a variable to multiple strings in Autohotkey将变量与 Autohotkey 中的多个字符串进行比较
【发布时间】:2018-01-23 21:21:36
【问题描述】:

通常在我的 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 有类似的东西吗?有没有更好的方法来比较一个变量和多个字符串?

【问题讨论】:

    标签: string comparison autohotkey


    【解决方案1】:

    许多不同的方式。

    • 自动热键方式(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))
      

    【讨论】:

    • 关于“AutoHotkey 方式”的注意事项:1) 分隔逗号周围的任何空格都很重要 2) 默认情况下匹配区分大小写
    • 在其当前形式中,正则表达式也将匹配fooval1bar
    【解决方案2】:
    ; 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"
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-03-17
      • 1970-01-01
      • 2015-08-14
      • 2021-03-04
      • 2016-03-03
      • 2015-10-03
      • 2017-03-02
      • 2017-10-25
      相关资源
      最近更新 更多