Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/384.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript VSCode高级代码段转换_Javascript_Regex_Visual Studio Code_Code Snippets_Vscode Snippets - Fatal编程技术网

Javascript VSCode高级代码段转换

Javascript VSCode高级代码段转换,javascript,regex,visual-studio-code,code-snippets,vscode-snippets,Javascript,Regex,Visual Studio Code,Code Snippets,Vscode Snippets,我试图创建一个基于文件路径创建类名的代码段。如果文件名为index.js,我希望类名取文件夹名。否则,请使用文件名 如果文件名为index.js(它正确地插入了文件夹名),我有一个转换(如下所示)当前正在工作 我将如何扩展这一点(假设它甚至是可能的)以也适用于第二种情况 我确实从中注意到,您可以使用一些基本的if/else格式,只有在存在捕获组的情况下,这些格式才会插入给定的文本。我已经能够用一些简单的例子让他们工作。但不确定这些是否可以用某种方式来完成我想做的事情 当前代码段: { "my

我试图创建一个基于文件路径创建类名的代码段。如果文件名为
index.js
,我希望类名取文件夹名。否则,请使用文件名

如果文件名为
index.js
(它正确地插入了文件夹名),我有一个转换(如下所示)当前正在工作

我将如何扩展这一点(假设它甚至是可能的)以也适用于第二种情况

我确实从中注意到,您可以使用一些基本的if/else格式,只有在存在捕获组的情况下,这些格式才会插入给定的文本。我已经能够用一些简单的例子让他们工作。但不确定这些是否可以用某种方式来完成我想做的事情

当前代码段:

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

@Wiktor稍后将添加正确的答案,但我想说一些关于vscode的变量转换中那些太长而无法注释的条件

如果你能像这样做,那就太好了:

“${TM\u FILEPATH/*\\(.+)\\((index\\.js)\;(.*)/${3:?$1:$2}}}/g}”,

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

不幸的是,虽然“普通”条件确实非常有效:

${3:?There is an index.js file:There is not an index.js file}
似乎不支持在条件文本替换中使用正则表达式组。这似乎来自语法链接(请参见语法片段)。请查看有关条件的这一部分:

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

我想说的是,条件if/else部分中的捕获组不受支持。它似乎不明确地允许捕获组-只有在/else纯文本的情况下才允许捕获组。

在评论中使用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}/};"
    ]
  }
}
我建议使用

${TM_FILEPATH/.*[\\/\\\\]([^\\/\\\\]+)[\\/\\\\]index\\.js$|.*[\\/\\\\](.*)/$1$2/}
如果不想将文件扩展名包括到输出中,请使用

${TM_FILEPATH/.*[\\/\\\\]([^\\/\\\\]+)[\\/\\\\]index\\.js$|.*[\\/\\\\](.*?)(?:\\.[^.]*)$/$1$2/}
正则表达式1将起作用,或者,请参见:

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

正则表达式详细信息

注意,反斜杠加倍,因为模式是作为字符串文本传递的,而
/
字符必须转义,因为字符串文本包含“stringized”regex文本

  • *[\/\]([^\/\]+)[\/\\]index\.js$
    • *
      -除换行符以外的任何0+字符,尽可能多
    • [\/\\]
      -a
      /
      \
    • ([^\/\]+)
      -捕获组1:一个或多个(
      +
      )字符,而不是
      /
      \
      [^…]
      是一个否定字符类)
    • [\/\\]
      -a
      /
      \
    • index\.js
      -一个
      index.js
      子字符串
    • $
      -字符串结尾
  • |
    -或
  • *[\/\\](.*)
    • *
      -除换行符以外的任何0+字符,尽可能多
    • [\/\\]
      -a
      /
      \
    • (.*)
      -捕获组2:除换行符以外的任何0+字符,尽可能多
    • (.*?(:\....^.]*)?$
      -将尽可能少地在组2中捕获除换行符以外的任何0个或更多字符,然后尝试匹配可选的
      和0+非点字符序列,直到字符串的末尾(
      $
因此,完整的代码片段如下所示

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

如果
c:\Users\wiktor\Documents\index.js
c:\Users\wiktor\Documents\index.js
中,那么类应该是
Documents
?如果是
c:\index.js
?@WiktorStribiżew Right,我已经让这部分与上面的内容一起工作了。不过,我还没有第二个案例工作(如果文件名不是索引,请以文件名命名)。此代码段不会在您询问的情况下使用。我并不是真的试图防范所有边缘情况。这将是一个特定于工作流的代码段。请尝试
${TM\u FILEPATH/*[\\\/\\\\](^\\/\\\\]+[\\/\\\\\\\\]index\\\\\\\.js$..[\\/\\\\\\\\\\\](.*/$1$2/}
。注意,我添加了
/
\
路径分隔符。请看,这就是它的工作方式。它是否如预期的那样工作?@WiktorStribiżew Regex解决方案非常完美,谢谢!必须进行一些调整,因为正如Mark提到的,使用VSCode转换引用Regex组是有限的。请在我的示例中随意复制/粘贴我的代码示例回答并将其作为新答案发布,我会给你评分。再次感谢!我更新了正则表达式,只返回文件名而不返回扩展名。