首页 > 解决方案 > VS Code Snippets 对单个变量进行多次转换

问题描述

正在阅读具有多个转换的 VS 代码片段,我非常努力,但无法解析它是如何完成的。

我需要使用${TM_FILEPATH}并剪掉某个点之前的所有内容并将所有内容替换\/.

对于 和 的路径/path/to/lib/file.cC:\path\to\lib\file.c我需要的结果是/lib/file.c

我已经为我的用例完成了第一部分:

${TM_FILEPATH/.*lib//}

不过,我似乎不能做第二个。我试过了:

 ${TM_FILEPATH/\\/\//g}

我需要两者都做。如果有人回答这个问题,他们是否也可以将其分解,以便我了解发生了什么?我想学习如何做这些,而不必一直问。

标签: regexvisual-studio-codecode-snippetsvscode-snippets

解决方案


这是一个蛮力的答案。“蛮力”,因为它仅适用于文件路径的最后两段。必须有一种方法可以将其推广到输入末尾的任意指定数量的路径段。

"PS2": {
  "prefix": "ps2",
  "body": [
    "${TM_FILEPATH/.*[\\/\\\\]([^\\/\\\\]+)[\\/\\\\]/\\/$1\\//}"
  ]
}

.*在我们想要的之前匹配所有内容。必须这样做,否则不匹配的输入将“通过”并且不会被转换或消除。

[\\/\\\\]匹配 a\或 an/这些字符必须在片段中进行双重转义。

([^\\/\\\\]+)不匹配字符序列\/

[\\/\\\\]匹配最后一个\或一个/

filePath的file.c部分根本不匹配,因此它不会被转换或消除 - 这对您来说很好。

\\/$1因为\or/被匹配但没有出现在转换中的任何地方,这些字符将不会出现在结果中。你只想要一个/$1/<and the rest unmatched here>

$1\\/在第 1 组之后,附加一个/(双转义),然后file.c因为它不匹配将出现在最后。

在这里,它以简化形式出现在regex101上,没有所有的双重转义。请注意,file.c不匹配,因此它将出现在结果中。


推荐阅读