具有多个转换的 VS 代码片段
VS Code snippet with multiple transforms
我正在尝试制作一个片段,它将获取剪贴板内容(markdown
文档中标题的文本)并将其转换为该部分的 link。例如,如果我的剪贴板包含:Some Heading - 20191107
那么我希望输出以下内容:
[Some Heading - 20191107](filename.md#some-heading---20191107)
这是我目前 markdown
的片段 VS Code
:
"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"
}
这有第一个转换,但我不知道如何嵌套多个转换:
- 用连字符替换所有 space。
- 全部改为小写。
- 删除所有匹配
[^a-z0-9-]
的字符
测试用例
为了阐明我对@Mark 的测试用例,在 VS Code
的 markdown
文档中,我制作了一个章节标题,例如:
# 20191107 - @#$%^& This is a section - 20191107
然后我复制文本 20191107 - @#$%^& This is a section - 20191107
和 运行 您为我修复的片段。它输出的是:
[20191107 - @#$%^& This is a section - 20191107](tips.tech.git.md#20191107----this-is-a-section---20191107)
标题有效link!
这是一个我认为满足所有要求的片段(我从我之前的回答中简化了这个)。
"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"
}
我会解释这部分:
${CLIPBOARD/([\w-]+$)|([\w-]+)|([-\s]+)|([^\w]+)/${1:/downcase}${2:/downcase}${2:+-}/gm}
这里的主要思想是捕获每个组,以便在其自己的组中进行不同的处理。正则表达式交替只会为每场比赛捕获一组。参见 regex101 demo。
然后您可以转换该组或忽略它而不影响任何后续匹配!
是四个捕获组的交替:
([\w-]+$)
注意$
表示行尾,必须先捕获组
([\w-]+)
与第 1 组相同,但不在行尾
([-\s]+)
捕获组中的空格和连字符
([^\w]+)
捕获组中 A-Za-z0-9
以外的任何字符
捕获组 1 获取 last 字符集,例如 12345
或 asdasd
。
捕获组 2 获取与组 1 相同的字符组,但如果它们位于行尾则不同。这很重要,因为如果有捕获组 2,将添加 -
,但如果有捕获组 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)
我正在尝试制作一个片段,它将获取剪贴板内容(markdown
文档中标题的文本)并将其转换为该部分的 link。例如,如果我的剪贴板包含:Some Heading - 20191107
那么我希望输出以下内容:
[Some Heading - 20191107](filename.md#some-heading---20191107)
这是我目前 markdown
的片段 VS Code
:
"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"
}
这有第一个转换,但我不知道如何嵌套多个转换:
- 用连字符替换所有 space。
- 全部改为小写。
- 删除所有匹配
[^a-z0-9-]
的字符
测试用例
为了阐明我对@Mark 的测试用例,在 VS Code
的 markdown
文档中,我制作了一个章节标题,例如:
# 20191107 - @#$%^& This is a section - 20191107
然后我复制文本 20191107 - @#$%^& This is a section - 20191107
和 运行 您为我修复的片段。它输出的是:
[20191107 - @#$%^& This is a section - 20191107](tips.tech.git.md#20191107----this-is-a-section---20191107)
标题有效link!
这是一个我认为满足所有要求的片段(我从我之前的回答中简化了这个)。
"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"
}
我会解释这部分:
${CLIPBOARD/([\w-]+$)|([\w-]+)|([-\s]+)|([^\w]+)/${1:/downcase}${2:/downcase}${2:+-}/gm}
这里的主要思想是捕获每个组,以便在其自己的组中进行不同的处理。正则表达式交替只会为每场比赛捕获一组。参见 regex101 demo。
然后您可以转换该组或忽略它而不影响任何后续匹配!
是四个捕获组的交替:
([\w-]+$)
注意$
表示行尾,必须先捕获组([\w-]+)
与第 1 组相同,但不在行尾([-\s]+)
捕获组中的空格和连字符([^\w]+)
捕获组中A-Za-z0-9
以外的任何字符
捕获组 1 获取 last 字符集,例如 12345
或 asdasd
。
捕获组 2 获取与组 1 相同的字符组,但如果它们位于行尾则不同。这很重要,因为如果有捕获组 2,将添加 -
,但如果有捕获组 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)