VS 代码片段中的嵌套正则表达式替换
Nested regex replacement in VS Code Snippet
我在重组文本 (rst) 文件中做了很多大胆的阅读,我本应该使用不同的标题样式,但我犯了一个错误。
我需要更换:
**some heading**
与:
some heading
............
我想用 VS 代码片段来做到这一点,我在其中突出显示有问题的文本,然后 运行 片段进行替换。
为此,我想我需要进行两次替换:
- 获取选定的文本,去除前导和尾随
**
- 取 1 的结果,然后基本上用文字点 (.) 替换任何内容 (.):
s/././g
我不知道如何在 VS 代码片段中进行嵌套替换——这甚至可能吗?
这是我现在拥有的:
"BoldToSubHeading": {
"prefix": ["boldtosubheading"],
"body": [
"${TM_SELECTED_TEXT/\*\*(.*)\*\*//}",
"${TM_SELECTED_TEXT/././g}",
],
"description": "Change bold text into subheading."
}
如果输入的文字是:
**foobar**
我多了四个点 -- 因为星号包含在最后一个替换中。
foobar
..........
Textmate docs,Snippet 代码似乎基于此,表示:
For nested replacements, use named captures as variables are inherited.
但是,我试过 "${TM_SELECTED_TEXT/(?<guts>.*)/${guts}/g}"
,但没有成功。
有什么建议可以解决我的更换问题吗?是否可以使用片段进行嵌套替换?
要求是:
- 突出显示的文本将在前后包含双星号
- 双星号之间的文本(我们称之为 'guts')可以包含任何内容 -- 空格、数字、引号等
- 结果应该是'guts',加上一个新行,加上等于胆量长度的点数。
我认为使用一个片段会更容易 - 也许有条件替换 - 但我无法在合理的时间内弄清楚。但是一步一步做起来很容易。
使用像 multi-command 这样的宏扩展,将其放入您的设置中:
"multiCommand.commands": [
{
"command": "multiCommand.refactorHeadings",
"interval": 250, // remove this line and will be instantaneous
"sequence": [
{
"command": "editor.action.insertSnippet",
"args": {
"snippet": "${TM_SELECTED_TEXT/\*\*(.*)\*\*//}",
}
},
"editor.action.copyLinesDownAction",
"cursorLineStartSelect",
{
"command": "editor.action.insertSnippet",
"args": {
"snippet": "${TM_SELECTED_TEXT/././g}",
}
}
]
}
],
和一个键绑定(在 keybindings.json 中)来触发它:
{
"key": "alt+c", // whatever keybinding you like
"command": "extension.multiCommand.execute",
"args": { "command": "multiCommand.refactorHeadings" },
// replace markdown with your langId
// "when": "editorTextFocus && editorHasSelection && editorLangId == markdown"
},
该演示显示了选择所有此类出现的简单查找正则表达式,Ctrl+Shift+L 会这样做,并触发宏。仅出于演示目的而显示速度变慢。
我在重组文本 (rst) 文件中做了很多大胆的阅读,我本应该使用不同的标题样式,但我犯了一个错误。
我需要更换:
**some heading**
与:
some heading
............
我想用 VS 代码片段来做到这一点,我在其中突出显示有问题的文本,然后 运行 片段进行替换。
为此,我想我需要进行两次替换:
- 获取选定的文本,去除前导和尾随
**
- 取 1 的结果,然后基本上用文字点 (.) 替换任何内容 (.):
s/././g
我不知道如何在 VS 代码片段中进行嵌套替换——这甚至可能吗?
这是我现在拥有的:
"BoldToSubHeading": {
"prefix": ["boldtosubheading"],
"body": [
"${TM_SELECTED_TEXT/\*\*(.*)\*\*//}",
"${TM_SELECTED_TEXT/././g}",
],
"description": "Change bold text into subheading."
}
如果输入的文字是:
**foobar**
我多了四个点 -- 因为星号包含在最后一个替换中。
foobar
..........
Textmate docs,Snippet 代码似乎基于此,表示:
For nested replacements, use named captures as variables are inherited.
但是,我试过 "${TM_SELECTED_TEXT/(?<guts>.*)/${guts}/g}"
,但没有成功。
有什么建议可以解决我的更换问题吗?是否可以使用片段进行嵌套替换?
要求是:
- 突出显示的文本将在前后包含双星号
- 双星号之间的文本(我们称之为 'guts')可以包含任何内容 -- 空格、数字、引号等
- 结果应该是'guts',加上一个新行,加上等于胆量长度的点数。
我认为使用一个片段会更容易 - 也许有条件替换 - 但我无法在合理的时间内弄清楚。但是一步一步做起来很容易。
使用像 multi-command 这样的宏扩展,将其放入您的设置中:
"multiCommand.commands": [
{
"command": "multiCommand.refactorHeadings",
"interval": 250, // remove this line and will be instantaneous
"sequence": [
{
"command": "editor.action.insertSnippet",
"args": {
"snippet": "${TM_SELECTED_TEXT/\*\*(.*)\*\*//}",
}
},
"editor.action.copyLinesDownAction",
"cursorLineStartSelect",
{
"command": "editor.action.insertSnippet",
"args": {
"snippet": "${TM_SELECTED_TEXT/././g}",
}
}
]
}
],
和一个键绑定(在 keybindings.json 中)来触发它:
{
"key": "alt+c", // whatever keybinding you like
"command": "extension.multiCommand.execute",
"args": { "command": "multiCommand.refactorHeadings" },
// replace markdown with your langId
// "when": "editorTextFocus && editorHasSelection && editorLangId == markdown"
},
该演示显示了选择所有此类出现的简单查找正则表达式,Ctrl+Shift+L 会这样做,并触发宏。仅出于演示目的而显示速度变慢。