从否定设置开始提取文本,直到(但不包括)第一次出现 @

Extract text starting from negated set up til (but not including) first occurance of @

美好的一天社区。

假设我有以下行:

    [ ] This is a sentence about apples. @fruit @tag

我希望创建一个可以通用提取部分的正则表达式: “这是关于苹果的句子。”只有.

即忽略句前的 [ ],忽略句后的@fruit @tag

到目前为止我得到的是:([^\s*\[\s\]\s])(.*@)

正在创建以下匹配项: This is a sentence about apples. @fruit @

我如何匹配但不包括第一次出现的 @ 符号,同时仍然否定 ([^\s*\[\s\]\s]) 组的 [ ] 模式?

编辑: 感谢 Wiktor Stribiżew 提供的重要帮助:

RegExMatch(str, "O)\[\s*]\s*([^@]*[^@\s])", output)

最终代码:

; Zim Inbox txt file
FileEncoding, UTF-8
File := "C:\Users\dragoon\Desktop\anki_cards.txt"

; sleep is necessary

;;Highlight line and copy
#IfWinActive ahk_exe zim.exe
{
clipboard=
sleep, 500
Send ^+c
ClipWait
Send ^{Down}
clipboardQuestion := clipboard
FoundQuestion := RegExMatch(clipboardQuestion,"O)\[\s*]\s*([^@]*[^@\s])",outputquestion)

clipboard=
sleep, 500
Send ^+c
ClipWait
clipboardAnswer := clipboard
FoundAnswer := RegExMatch(clipboardAnswer,"O)\[\s*]\s*([^@]*[^@\s])",outputanswer)

quotedQuestionAnswer := outputquestion[1] """" outputanswer[1] """"

Fileappend, %quotedQuestionAnswer%, %File%
}

它的作用: 在 Zim Wiki 笔记本中,在 Windows 上,按 Win+V 热键在问题上?在以下结构中:

[ ] Question Header
    [ ] Question?
        [ ] Answer about dogs @cat @dog

这将导致文本在外部文件中被格式化:

Question?"Answer about dogs"

这是Anki卡片导入可接受的格式,可用于快速从复习结构中制作卡片。再次感谢您对我的第一个 SO 问题的所有帮助。

您可以使用

\[\s*]\s*\K[^@]*[^@\s]

regex demo详情:

  • \[\s*]\s* - [,零个或多个空格,],零个或多个空格
  • \K - “忘记”刚刚匹配的内容
  • [^@]* - @
  • 以外的零个或多个字符
  • [^@\s] - @ 和空格以外的字符。

请注意,在 AutoHotKey 中,如果使用 对象模式:

,您还可以 捕获 匹配的部分
RegExMatch(str, "O)\[\s*]\s*([^@]*[^@\s])", output)

您要使用的字符串是使用第 1 组模式(用一对未转义的括号定义的)捕获的,您可以通过 output[1] 访问它。见 documentation:

Object mode. [v1.1.05+]: This causes RegExMatch() to yield all information of the match and its subpatterns to a match object in OutputVar. For details, see OutputVar.