带有动态热字串模块的 Autohotkey 变量赋值

Autohotkey variable assignment with dynamic hotstrings module

有人指出 this 允许动态热字串的 AutoHotKey 模块。

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

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

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

我想使用此模块将单词中的点 . 替换为中间点 。我已经想出如何“查找”文本,但不知道如何正确替换它。我需要引用初始文本以便将其放入替换文本中。在上面的代码中,使用 p := Round( / * 100) 使用输入的数字来计算百分比,但我不知道如何对字母进行同样的操作。

我的代码如下:

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

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

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

我该怎么做?

谢谢

这里没有什么问题。

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

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

之后的字符

所以现在我们进入第二个问题,指的是捕获组变量。

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

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


现在会有一个几乎可以工作的脚本,如下所示:

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

word:
    SendInput, %  "{U+22C5}" 
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}" 
Return

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