4

我正在尝试创建一个基于文件路径创建类名的片段。如果文件名为index.js,我希望类名采用文件夹名称。否则,使用文件名。

index.js如果文件被命名(它正确插入文件夹名称),我有一个当前正在工作的转换(如下所示)。

我将如何扩展这个(假设它甚至可能)也适用于第二种情况?

我确实从VSCode 文档中注意到,您可以使用一些基本的 if/else 格式,如果存在捕获组,它们只会插入给定的文本。我已经能够让那些使用一些简单的例子。但不确定这些是否可以以某种方式用于完成我想要做的事情。

当前片段:

{
  "mySnippet": {
    "prefix": "cls",
    "body": [
        "class ${TM_FILEPATH/[\\/\\w$]+\\/(?!index)|\\/index.js//g} {}",
        "export default ${TM_FILEPATH/[\\/\\w$]+\\/(?!index)|\\/index.js//g};"
    ]
  },
}
4

3 回答 3

4

我建议使用

${TM_FILEPATH/.*[\\/\\\\]([^\\/\\\\]+)[\\/\\\\]index\\.js$|.*[\\/\\\\](.*)/$1$2/}

如果您不想在输出中包含文件扩展名,请使用

${TM_FILEPATH/.*[\\/\\\\]([^\\/\\\\]+)[\\/\\\\]index\\.js$|.*[\\/\\\\](.*?)(?:\\.[^.]*)$/$1$2/}

正则表达式 #1 将按此处所示正则表达式 #2 此处工作,请参阅其图表

在此处输入图像描述

这里的重点是使用两个用|替换运算符分隔的替代方案,它们将匹配整个字符串,同时捕获您需要的部分,确保更具体(具有已知文件名)的替代方案首先出现,而更通用的替代方案(将匹配任何文件名都将排在最后。替换模式将是两个反向引用,$1$2因为在找到匹配项后只有一个实际上会包含一些文本。

正则表达式详细信息

请注意,反斜杠加倍,因为模式作为字符串文字传递,并且/字符必须转义,因为字符串文字包含“字符串化”正则表达式文字。

  • .*[\/\\]([^\/\\]+)[\/\\]index\.js$
    • .*- 除换行符以外的任何 0+ 个字符,尽可能多
    • [\/\\]- 一个/\
    • ([^\/\\]+)- 捕获组 1:一个或多个 ( +) 字符,而不是/(\[^...]一个否定字符类)
    • [\/\\]- 一个/\
    • index\.js- 一个index.js子串
    • $- 字符串结束
  • |- 或者
  • .*[\/\\](.*)
    • .*- 除换行符以外的任何 0+ 个字符,尽可能多
    • [\/\\]- 一个/\
    • (.*)- 捕获组 2:除换行符之外的任何 0+ 个字符,尽可能多
    • (.*?)(?:\.[^.]*)?$- 将尽可能少地捕获除换行符之外的任何 0 个或多个字符到第 2 组,然后将尝试匹配一个可选序列.和 0+ 个非点字符,直到字符串 ( $) 的末尾。

所以,完整的代码片段看起来像

{
  "mySnippet": {
    "prefix": "cls",
    "body": [
      "class ${TM_FILEPATH/.*[\\/\\\\]([^\\/\\\\]+)[\\/\\\\]index\\.js$|.*[\\/\\\\](.*?)(?:\\.[^.]*)$/$1$2/} {}",
      "export default ${TM_FILEPATH/.*[\\/\\\\]([^\\/\\\\]+)[\\/\\\\]index\\.js$|.*[\\/\\\\](.*?)(?:\\.[^.]*)$/$1$2/};"
    ]
  }
}

随意调整它。

于 2019-06-22T09:38:59.230 回答
2

@Wiktor 稍后会添加正确的答案,但我想对 vscode 的变量转换中的那些条件说些什么,这些条件对于评论来说太长了。

如果您可以执行以下操作,那就太好了:

"${TM_FILEPATH/.*\\(.+)\\((index\\.js)|(.*))/${3:?$1:$2}}/g}",

一个条件如果组 3 不为空插入组 1(父目录),否则插入组 2(文件名)。但这不起作用,尽管正则表达式很好(尽管简化了 re: 路径分隔符和文件扩展名)。

不幸的是,虽然“普通”条件确实可以很好地工作:

${3:?There is an index.js file:There is not an index.js file}

似乎不支持在条件文本替换中使用正则表达式组。这似乎来自语法链接(请参阅片段语法] 1。查看有关条件的这部分:

'${' int ':?' if ':' else '}' 

我会说不支持条件 if/else 部分中的捕获组。它似乎并没有明确地允许捕获组 - 只有 if/else 纯文本。

于 2019-06-22T01:24:28.037 回答
1

凭借 Wiktor 在评论中对正则表达式的掌握,结合文档、Mark 的进一步见解以及一些额外的调整(由于 VSCode 转换限制,正则表达式捕获组被替换/转换的方式),我终于能够放在一起一个可行的解决方案。

{
  "mySnippet": {
    "prefix": "cls",
    "body": [
      "class ${TM_FILEPATH/(.*[\\/\\\\])([^\\/\\\\]+)([\\/\\\\]index\\.[jt]s$)|(.*[\\/\\\\])(.*)(\\.[jt]s)/${2}${5}/} {}",
      "export default ${TM_FILEPATH/(.*[\\/\\\\])([^\\/\\\\]+)([\\/\\\\]index\\.[jt]s$)|(.*[\\/\\\\])(.*)(\\.[jt]s)/${2}${5}/};"
    ]
  }
}
于 2019-06-22T03:06:36.690 回答