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