具有多个转换的 VS Code 片段

Rob*_*ram 4 visual-studio-code vscode-snippets

我正在尝试制作一个片段,它将获取剪贴板内容(文档中标题的markdown文本)并将其转换为该部分的链接。例如,如果我的剪贴板包含:Some Heading - 20191107那么我希望输出以下内容:

[Some Heading - 20191107](filename.md#some-heading---20191107)
Run Code Online (Sandbox Code Playgroud)

这里是我的代码段VS Code用于markdown至今:

    "link to this section": {
        "prefix": "isection",
        "body": [
            "[${1:${CLIPBOARD}}](${TM_FILENAME}#${CLIPBOARD/ /-/g})"
        ],
        "description": "Insert link to section whose heading text is in the clipboard"
    }
Run Code Online (Sandbox Code Playgroud)

这是第一个转换,但我无法弄清楚如何嵌套多个转换:

  • 用连字符替换所有空格。
  • 全部改为小写。
  • 删除任何匹配的字符 [^a-z0-9-]

测试用例

为了澄清@Mark 的测试用例,在 中的markdown文档中VS Code,我创建了一个部分标题,例如:

# 20191107 - @#$%^& This is a section - 20191107
Run Code Online (Sandbox Code Playgroud)

然后我复制文本20191107 - @#$%^& This is a section - 20191107并运行您为我修复的代码段。它输出的是:

[20191107 - @#$%^& This is a section - 20191107](tips.tech.git.md#20191107----this-is-a-section---20191107)
Run Code Online (Sandbox Code Playgroud)

这是标题的有效链接!

Mar*_*ark 5

这是我认为满足所有要求的片段(我从我之前的回答中简化了这一点)。

"link to this section": {
  "prefix": "isection",
  "body": [

    "[${1:${CLIPBOARD}}](${TM_FILENAME}#${CLIPBOARD/([\\w-]+$)|([\\w-]+)|([-\\s]+)|([^\\w]+)/${1:/downcase}${2:/downcase}${2:+-}/gm})"

  ],
  "description": "Insert link to section whose heading text is in the clipboard"
}
Run Code Online (Sandbox Code Playgroud)

我将解释这部分:

${CLIPBOARD/([\\w-]+$)|([\\w-]+)|([-\\s]+)|([^\\w]+)/${1:/downcase}${2:/downcase}${2:+-}/gm}

这里的主要思想是捕获每个组以在其自己的组中进行不同的处理。正则表达式交替只会为每场比赛捕获一组。请参阅regex101 演示

然后您可以转换该组或忽略它,而不会影响任何后续匹配!

它是四个捕获组的交替:

  1. ([\\w-]+$) 注意$表示行尾,必须是第一个捕获组
  2. ([\\w-]+) 与第 1 组相同,但不在行尾
  3. ([-\\s]+) 捕获组中的空格和连字符
  4. ([^\\w]+) 捕获A-Za-z0-9组中以外的任何字符

捕获组 1获取最后一组字符,例如12345asdasd

捕获组 2获得与组 1 相同的字符组,但如果它们位于行尾则不会。这很重要,因为-如果有捕获组 2,则会添加 a,但如果有捕获组 1,则不会添加(因此不会在末尾添加连字符)。

捕获组 3捕获空格和连字符。它将在输出中被忽略。

捕获组 4捕获那些非A-Za-z0-9字符并将被忽略。

这是转换的输出:${1:/downcase}${2:/downcase}${2:+-} 注意没有提到第 3 组或第 4 组——它们被丢弃了。但是它们必须匹配,否则它们将通过“未转换”并出现在结果中 - 我们没有。

所以小写组 1 和 2,由于交替,永远不会在同一场比赛中同时出现。

${2:+-} 如果有第 2 组-,则在其后添加一个。整个 CLIPBOARD 的最后一场比赛将是第 1 组,因此最后一场比赛不会附加连字符。

由于该g标志,正则表达式运行了几次,每次只捕获 4 个组中的一个。


输入:Some Heading - 20191107
输出:[Some Heading - 20191107](fileName.ext#some-heading-20191107)

输入:20191107 - @#$%^& This is a section - 20191107
输出:[20191107 - @#$%^& This is a section - 20191107](test-bed-snippets.code-snippets#20191107-this-is-a-section-20191107)


如果结果中需要更多连字符,例如:

[Some Heading - 20191107](filename.md#some-heading---20191107)

只需将连字符从第三个捕获组中取出:([\\s]+)导致:

[20191107 - @#$%^& This is a section - 20191107](test-bed-snippets.code-snippets#20191107---this-is-a-section---20191107)