【问题标题】:AutoHotkey: Why are assignment, InsertAt, length, and MaxIndex, not working on an array generated by RegExMatch()?AutoHotkey:为什么赋值、InsertAt、length 和 MaxIndex 对 RegExMatch() 生成的数组不起作用?
【发布时间】:2020-10-14 21:36:41
【问题描述】:

在 AutoHotkey 中,RegExMatch() 在模式 3(匹配对象)中将匹​​配的字符串放入 array。我可以使用array[index] 获取匹配项,我可以使用.count() 获取匹配项数。但是我有以下问题:

  • 当我尝试使用:= 更改数组元素的值时,该值不会改变。
  • 当我尝试使用 .InsertAt 插入元素时,没有插入任何内容。
  • 当我尝试使用 .length().MaxIndex() 获取数组的大小时,我什么也得不到。

以下脚本演示了此行为:

; "TestScript.ahk"

; Use a regular expression to read data from a string, then test the behavior of the resulting array.

#NoEnv
#Warn

^+z::                           ; Hotkey for this script: Ctrl-shift-Z
sDataString := "A1B2C3"
nFoundPosn := RegExMatch(sDataString, "O)A(\d)B(\d)C(\d)", asData)
asData[2] := "4"
asData.InsertAt(3, "5")
MsgBox % "I expect the following to produce:`n"
        . "{1, 4, 5, 3}`n"
        . ">4<, >4<, >4<`n"
        . "`n"
        . "but instead I get:`n"
        . "{" . asData[1] . ", " . asData[2] . ", " . asData[3] . ", " . asData[4] . "}`n"
        . ">" . asData.count() . "<, >" . asData.length() . "<, >" . asData.MaxIndex() . "<"
return

产生以下输出:

显然,关于正在生成的数组以及如何使用它,我有些不明白。赋值和插入不起作用的事实向我表明数组变量是一个指针,但我在上面链接的文档中没有看到任何关于它的内容,所以如果它是一个指针,我不知道如何访问它指向的对象。我做错了什么,或者我误解了什么?

【问题讨论】:

    标签: arrays autohotkey


    【解决方案1】:

    您遇到了多么有趣的事情!我以为你肯定犯了错误,但我错了。似乎唯一可用的属性是那些listed in the help documentation for that mode。令人讨厌的是,它不能被视为标准对象;你甚至不能克隆它来做有用的工作。正如备受尊敬的 AHK 论坛用户 jeeswg 所发现的 (here),唯一的选择是遍历匹配对象并从中构建一个数组,如下所示。

    ^+z::
    asDataNew := []
    sDataString := "A1B2C3"
    nFoundPosn := RegExMatch(sDataString, "O)A(\d)B(\d)C(\d)", asData)
    
    Loop , % asData.count()
        asDataNew[A_Index] := asData[A_Index]
    
    asDataNew[2] := "4"
    asDataNew.InsertAt(3, "5")
    MsgBox % "I expect the following to produce:`n"
            . "{1, 4, 5, 3}`n"
            . ">4<, >4<, >4<`n"
            . "`n"
            . "but instead I get:`n"
            . "{" . asData.1 . ", " . asData[2] . ", " . asData[3] . ", " . asData[4] . "}`n"
            . ">" . asData.count() . "<, >" . asData.length() . "<, >" . asData.MaxIndex() . "<`n"
            . "`n"
            . "With hard copy I get:`n"
            . "{" . asDataNew.1 . ", " . asDataNew[2] . ", " . asDataNew[3] . ", " . asDataNew[4] . "}`n"
            . ">" . asDataNew.count() . "<, >" . asDataNew.length() . "<, >" . asDataNew.MaxIndex() . "<"
    return
    

    【讨论】:

    • 谢谢。 jeeswg 的那篇文章还提出了一个可能是这种情况的原因:“优化......考虑到大字符串,只读的东西是有利的。”这是有道理的,因为 RegEx 确实经常(包括我自己)用于非常大的字符串,所以这让我感觉更好的是必须编写一个小循环来将结果转换为我可以操作的东西。正如您所展示的,循环的代码很简单。
    • @NewSites 啊,我明白了,感谢您的洞察力。不过,至少能够克隆它会很好。
    猜你喜欢
    • 2010-12-13
    • 2021-09-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-20
    • 1970-01-01
    • 1970-01-01
    • 2019-09-25
    相关资源
    最近更新 更多