删除文件名的扩展名并使用正则表达式 vscode 片段将驼峰式大小写转换为蛇形大小写?

问题描述

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

from .decorator import time_decorator

@time_decorator
def view(request):
    pass
    

我当前的正则表达式是

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} 。有两个问题

  • 我无法删除 -
  • 开头有额外的 .ts

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

解决方法

您已接近删除文件扩展名:改用 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 时才添加 -

,

您可以使用此代码段:

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():小写结果字符串

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...