VS 代码片段中的嵌套正则表达式替换

Nested regex replacement in VS Code Snippet

我在重组文本 (rst) 文件中做了很多大胆的阅读,我本应该使用不同的标题样式,但我犯了一个错误。

我需要更换:

**some heading**

与:

some heading
............

我想用 VS 代码片段来做到这一点,我在其中突出显示有问题的文本,然后 运行 片段进行替换。

为此,我想我需要进行两次替换:

  1. 获取选定的文本,去除前导和尾随**
  2. 取 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}",但没有成功。

有什么建议可以解决我的更换问题吗?是否可以使用片段进行嵌套替换?

要求是:

  1. 突出显示的文本将在前后包含双星号
  2. 双星号之间的文本(我们称之为 'guts')可以包含任何内容 -- 空格、数字、引号等
  3. 结果应该是'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 会这样做,并触发宏。仅出于演示目的而显示速度变慢。