假设我的 Cliboard
变量当前处于这种状态:
Clipboard:= "-Classes Essay on Hobbes
我想根据剪贴板中的第一个块/单词执行 If
条件,在本例中为 -Classes
。本质上使用 FileAppend
执行如下操作:
if "-diary"{
;Create file in /Diary/Entry 27.MD
}
Else if "-Classes"{
;Create file in /Classes/Essay on Hobbes.MD
}
我能够在文档中找到此页面 https://www.autohotkey.com/docs/commands/IfIn.htm 但它不是位置的,这意味着如果块 -Classes
由于某种原因也作为文件名的一部分出现,我的逻辑就会中断。
我也冒昧地在其他论坛上交叉发布了这个问题。任何帮助将不胜感激!
回答1
或者..你可以:
Clipboard:= "-Classes Essay on Hobbes"
Gosub % subroutine := SubStr( Clipboard, 1, InStr( Clipboard, " " )-1 )
Clipboard:= "-diary diary example"
Gosub % subroutine := SubStr( Clipboard, 1, InStr( Clipboard, " " )-1 )
Return
-diary:
MsgBox % "Diary:`n" StrReplace( clipboard, subroutine " " )
;Create file in /Diary/Entry 27.MD
Return
-Classes:
MsgBox % "Classes:`n" StrReplace( clipboard, subroutine " " )
;Create file in /Classes/Essay on Hobbes.MD
Return
回答2
你可以试试 StrSplit()
; Array := StrSplit(String , Delimiters, OmitChars, MaxParts)
clip_array := StrSplit(Clipboard, A_Space, , 1)
if clip_array[1] = "-diary"{
;Create file in /Diary/Entry 27.MD
}
Else if clip_array[1] = "-Classes"{
;Create file in /Classes/Essay on Hobbes.MD
}
Else {
MsgBox % "No match for " clip_array[1]
}
在此处描述 https://www.autohotkey.com/docs/commands/StrSplit.htm 并注意 MaxParts
的参数,它解决了要查看的“令牌”数量(保持最后的其余部分)如果剪贴板足够大以致重要(在这种情况下,我不确定其他答案是否更好)。
回答3
如果剪贴板上的文本量很大,则可能会导致脚本延迟将所有文本加载到脚本内存中,只需检查第一个 value。我建议使用 regexMatch,因为它可以返回一个位置并捕获单词,而无需解析所有内容。
; for reference of regexMatch function
; regexMatch(Haystack, Needle, outputVar, startPos)
Fnd := regexMatch(Clipboard, "U)(\-[\w]+))", capSubStr, inStr(Clipboard, "-"))
if (Fnd==0) {
Msgbox, Didn't find a word on the Clipboard.
Return
}
checkVal := capSubStr1
if (checkVal=="-diary") {
;Create file in /Diary/Entry 27.MD
} Else if (checkVal=="-Classes") {
;Create file in /Classes/Essay on Hobbes.MD
}
以下是在 AHK 中使用正则表达式的基本参考:https://www.autohotkey.com/docs/misc/RegEx-QuickRef.htm
如果您还不熟悉正则表达式,这将让您了解上述表达式实际上在寻找什么。