VS 代码片段变换: if (正则表达式匹配 X) { 使用变换 A } else if (正则表达式匹配 Y) { 使用变换 B }

jab*_*tta 5 javascript regex code-snippets visual-studio-code vscode-snippets

我正在尝试创建一个片段,该片段根据文件路径创建类名。如果文件名为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};"
    ]
  },
}
Run Code Online (Sandbox Code Playgroud)

Wik*_*żew 6

我建议使用

${TM_FILEPATH/.*[\\/\\\\]([^\\/\\\\]+)[\\/\\\\]index\\.js$|.*[\\/\\\\](.*)/$1$2/}
Run Code Online (Sandbox Code Playgroud)

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

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

正则表达式 #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/};"
    ]
  }
}
Run Code Online (Sandbox Code Playgroud)

您可以随意调整它。