【问题标题】:Autohotkey variable assignment with dynamic hotstrings module带有动态热字串模块的自动热键变量分配
【发布时间】:2021-02-19 14:39:27
【问题描述】:

我一直指向this AutoHotKey 模块,它允许动态热字符串。

其中一个示例是在打字时计算百分比(例如,5/40% 将变为 8%)。为此,需要以下代码:

hotstrings("(\d+)\/(\d+)%", "percent")

percent:
p := Round($1 / $2 * 100)
Send, %p%`%
Return

我想用这个模块在单词中用中间点 替换点.。我已经弄清楚如何“找到”文本,但不知道如何正确替换它。我需要参考初始文本才能将其放入替换文本中。在上面的代码中,p := Round($1 / $2 * 100) 使用输入的数字来计算百分比,但我不知道如何对字母做同样的事情。

我的代码如下:

hotstrings("[a-z]\.[a-z](\.[a-z])*", "word")

word:
a := $1
b := $2
Send, a{U+22C5}b
Return

但这只是用一个中间点替换整个内容,而不是替换周围的字母。另外,我不知道如何考虑多个点的可能性(例如 a.b.c.d)。在 python 中,我会做一个for 循环,但我真的不知道 AutoHotKey。

我该怎么做?

谢谢

【问题讨论】:

    标签: regex autohotkey


    【解决方案1】:

    这里的问题很少。

    第一个是正则表达式。
    首先,您并不真的想将正则表达式视为匹配无限长的a.b.c.d.e.f.g.h.i.j.k.l.... 字符串,而是只想考虑单个案例x.y。这些案例可以彼此相邻。
    所以摆脱(\.[a-z])*

    其次,您没有捕获组。或者好吧,你确实有一个,但我假设你不小心做到了。如果您还不熟悉 Regex 捕获组,我建议您学习它们,它们在某些情况下非常有用(比如这里!)。
    但无论如何,要创建捕获组,您只需将 ( ) 放在要捕获的正则表达式部分周围。
    所以你想捕捉.之前和之后的字符(或者好吧,实际上只有后一个,这种方法会有问题,稍后会详细介绍)。所以你的正则表达式现在看起来像这样:
    ([a-z])\.([a-z])
    在匹配时,hotstrings() 函数将输出两个变量,$1$2(它们就是变量名称)。
    当您引用变量时,$1 为您提供. 之前的字符,$2 为您提供. 之后的字符。


    现在我们进入第二个问题,涉及捕获组变量。

    a := $1
    b := $2
    Send, a{U+22C5}b
    

    您在这里无缘无故地创建了变量ab,虽然这当然不是问题,但是如何尝试引用变量ab 是一个问题。
    您正在使用发送命令,因此您使用的是旧版 AHK 语法。在旧版 AHK 语法中,您通过将变量包裹在 %% 中来引用变量。
    所以你的发送命令看起来像这样:
    Send, %a%{U+22C5}%b%
    但是我们不要编写旧版 AHK(即使 hotstrings() 函数完全是旧版 AHK)。
    要切换到现代 AHK(表达式语法),我们会指定一个 %,后跟一个空格。然后我们可以这样做:
    SendInput, % $1 "{U+22C5}" $2
    也跳过了定义无用变量ab 并切换了SendInput,因为它是推荐的更快更可靠的发送模式。


    现在会有一个几乎可以正常工作的脚本:

    hotstrings("([a-z])\.([a-z])", "word")
    return
    
    word:
        SendInput, % $1 "{U+22C5}" $2
    Return
    

    它只是有链接多个a.b.c.d.e.f.g... 不能很好地工作的问题。但这很好,因为 Regex 可以进行更多改进。

    我们希望使用积极的后视,并仅捕获. 之后的字符,如下所示:
    (?<=[a-z])\.([a-z]) 另外,我想说用\w(匹配任何单词字符)替换[a-z] 是合适的。所以正则表达式和整个脚本将是:

    hotstrings("(?<=\w)\.(\w)", "word")
    return
    
    word:
        SendInput, % "{U+22C5}" $1
    Return
    

    现在它应该可以按要求工作了。
    如果我关于传统与现代 AHK 的讨论让您感到困惑(如果您不知道其中的区别,这是可以预料的),我建议您给出例如这是一个阅读:
    https://www.autohotkey.com/docs/Language.htm

    【讨论】:

      猜你喜欢
      • 2021-12-21
      • 1970-01-01
      • 1970-01-01
      • 2012-11-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-19
      • 2021-01-19
      相关资源
      最近更新 更多