这里的问题很少。
第一个是正则表达式。
首先,您并不真的想将正则表达式视为匹配无限长的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
您在这里无缘无故地创建了变量a 和b,虽然这当然不是问题,但是如何尝试引用变量a 和b 是一个问题。
您正在使用发送命令,因此您使用的是旧版 AHK 语法。在旧版 AHK 语法中,您通过将变量包裹在 %% 中来引用变量。
所以你的发送命令看起来像这样:
Send, %a%{U+22C5}%b%
但是我们不要编写旧版 AHK(即使 hotstrings() 函数完全是旧版 AHK)。
要切换到现代 AHK(表达式语法),我们会指定一个 %,后跟一个空格。然后我们可以这样做:
SendInput, % $1 "{U+22C5}" $2
也跳过了定义无用变量a 和b 并切换了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