删除文件名的扩展名并使用正则表达式 vscode 片段将 camelCase 转换为 snake case?

Remove the extension of filename and convert camelCase to snake case using regex vscode snippets?

我需要在同一结构上创建多个文件。导出的模块和文件名有一定的关系。我必须转换。输入和输出示例。

startNewGame.ts => start-new-game
gameOver.ts => game-over
ALongNameForAFile.ts=> a-long-name-for-file
short.ts => short

我当前的正则表达式是

${TM_FILENAME/([A-Z])/-${1:/downcase}/g}

目前我只能删除这么小的更改大写字母并添加 -。有两个问题

注意:我在 vscode 片段中使用这个

您可以使用此代码段:

const arr = ['startNewGame.ts', 'gameOver.ts',
 'ALongNameForAFile.ts', 'short.ts'];

arr.forEach(s => {
   console.log(
   s.replace(/(?!^)(?=[A-Z])/g, '-').replace(/\.\w+$/, '').toLowerCase()
   );
});

解决这个问题的步骤如下:

  • .replace(/(?!^)(?=[A-Z])/g, '-'): 在大写字母
  • 前插入-
  • .replace(/\.\w+$/, ''): 删除扩展部分
  • .toLowerCase(): 小写结果字符串

您即将删除文件扩展名:改用 TM_FILENAME_BASE。参见 vscode snippet variables

"filename change": {
  "prefix": "_co",
  "body": [
    "${TM_FILENAME_BASE/(^[A-Z])|([A-Z])/${2:+-}${2:/downcase}${1:/downcase}/g}",
  ],
  "description": ""
},

由于前导 - 仅在开头有大写字母时出现,我发现单独处理这种情况最容易。所以现在的正则表达式是:

(^[A-Z])|([A-Z]) // 顺序很重要。

${2:+-}是一个条件,只有在有捕获组2时才添加-