JavaScript正则替换需求:为Anki闪卡添加结束标记
解决Anki闪卡自动添加结束标记的正则替换问题
需求说明
需要实现JavaScript正则替换逻辑,完成以下操作:
- 为所有未添加
<!-- end of flashcard -->标记的Anki格式闪卡自动补上该标记 - 若闪卡内容后紧跟以
^开头的行,保留该行在结束标记上方后再添加结束标记 - 已存在结束标记的闪卡不做修改
- 开启多行模式,支持全局多次替换
现有尝试问题
之前编写的正则未正确匹配以^开头的行,且未排除已存在结束标记的闪卡,导致无法实现预期效果:
(?:\> \[!anki\]-) ([^\n]+)\n(.+(?:\n(?:^.{1,3}$|^.{4}(?<!<!--).*))*)
替换模板:
(?:\> \[!anki\]-) ([^\n]+)\n(.+(?:\n(?:^.{1,3}$|^.{4}(?<!<!--).*))*)(\n<!-- end of flashcard -->|\n)
修正后的解决方案
正则表达式(开启gm模式)
/^> \[!anki\]- ([^\n]+)\n((?:(?:> .*|^\^.*)\n?)*)(?!<!-- end of flashcard -->)/gm
替换字符串
`> [!anki]- $1\n$2<!-- end of flashcard -->\n`
正则逻辑解释
- 标题匹配:
^> \[!anki\]- ([^\n]+)匹配闪卡的标题行,捕获标题内容到分组$1 - 内容捕获:
((?:(?:> .*|^\^.*)\n?)*)捕获闪卡的所有内容行,包括:- 以
>开头的常规闪卡内容行 - 以
^开头的特殊标记行 - 每行末尾的换行符
- 以
- 排除已标记闪卡:
(?!<!-- end of flashcard -->)负向预查,确保当前位置后没有结束标记,避免重复处理
示例验证
输入
> [!anki]- Title > Answer > [!anki]- Title > Answer <!-- end of flashcard --> > [!anki]- Title > Answer > Another line > Another line > [!anki]- Title > Answer ^7a6a36
输出
> [!anki]- Title > Answer <!-- end of flashcard --> > [!anki]- Title > Answer <!-- end of flashcard --> > [!anki]- Title > Answer > Another line > Another line <!-- end of flashcard --> > [!anki]- Title > Answer ^7a6a36 <!-- end of flashcard -->
内容的提问来源于stack exchange,提问作者Minoo
相关产品推荐
相关产品推荐

