5

在我正在编写的 Visual Studio 代码片段中,我想将蛇大小写字符串转换为驼峰大小写。

文档中我知道语法是

'${' var '/' regex '/' (format | text)+ '/' options '}'

所以我想出了这个:

${TM_FILENAME_BASE/([a-z])([a-z]*)_+([a-z])([a-z]*)_+/${1:/upcase}$2${3:/upcase}$4/}

但是,此代码仅适用于具有 2 个元素的字符串(例如“carrot_cake”),而我想处理具有任意数量元素的字符串(“blueberry_pie_with_a_cup_of_coffee”)。

'regex'我想在and中需要某种递归'format',但我不知道该怎么做。

如何匹配任意数量的模式出现?

4

2 回答 2

14

更新

vscode v1.58 正在添加一个/camelcase转换。这使您的用例现在变得非常容易。

"${1/(.)(.*)/${1:/upcase}${2:/camelcase}/}"

blueberry_pie_with_a_cup_of_coffeeBlueberryPieWithACupOfCoffee


"${1/(.*)/${1:/camelcase}/}"// 只捕获整个事物

blueberry_pie_with_a_cup_of_coffeeblueberryPieWithACupOfCoffee

vscode 的实现使用了这个正则表达式:[a-zA-Z0-9]所以除了这些字符之外的任何东西都将被视为分隔符——并且下面的“单词”将被大写。



上一个答案::

要将任意数量的“_”分隔单词转换为 CamelCase,请尝试:

编辑:2018 年 10 月(但截至 2020 年 2 月尚未添加到片段语法文档中)vscode 添加了/pascalcase转换,请参阅commit。我修改了下面的代码以使用/pascalcase转换。它只适用于some_file => SomeFileCamelCase 类型。

但它可以使用许多字符作为分隔符,这些都有效:

blueberry_pie_with_a_cup_of_coffee
blueberry-pie-with-a-cup-of-coffee
blueberry-pie-with_a-cup-of_coffee
blueberry-pie-with.a-cup-of.coffee
blueberry*pie-with.a*cup-of.coffee
blueberry*pie@with.a*cup1of.coffee
blueberry*pie@with.a*cup1of.coffee

"camelCase": {
    "prefix": "_cc",
    "body": [
            // "${TM_FILENAME_BASE/([a-z]*)_+([a-z]*)/${1:/capitalize}${2:/capitalize}/g}"

            "${TM_FILENAME_BASE/(.*)/${1:/pascalcase}/g}"
        ],
        "description": "Transform to camel case"
    },

carrot_cake.txt-> CarrotCake

blueberry_pie_with_a_cup_of_coffee.js-> BlueberryPieWithACupOfCoffee

[我假设CamelCase是您想要的形式,还有其他形式,例如camelCase。]

对于camelCase

"${TM_FILENAME_BASE/([a-z]*)[-@_.*0-9]+([a-z]*)/$1${2:/capitalize}/g}"

将所需的分隔符列表放入[-@_.*0-9]+部件中。例如,+量词允许您使用carrot--cake- 单词之间的多个分隔符。感谢使用[list the separators]正则表达式部分的其他答案。

请注意,最后的“g”标志正在为您完成大部分工作,以获取超出明确捕获的两个匹配项之外的匹配项。

我像你们一样离开了捕获组([a-z]*)。您可能希望使用([A-Za-z0-9]*)更大的灵活性。

于 2018-07-08T01:33:58.297 回答
3

vs 代码片段转换为camelCase

"test": {
    "prefix": "test",
    "body": [
        "${1:${TM_FILENAME_BASE/^(.)([a-zA-Z0-9]*)([-_.])(.*)/${1:/downcase}${2}${4:/pascalcase}/}}"
    ]
}

包装是${1:}

内是${TM_FILENAME_BASE/^(.)([a-zA-Z0-9]*)([-_.])(.*)/${1:/downcase}${2}${4:/pascalcase}/}

包装是${}

内是TM_FILENAME_BASE/^(.)([a-zA-Z0-9]*)([_\\W])(.*)/${1:/downcase}${2}${4:/pascalcase}/

字符串是TM_FILENAME_BASE

-------------------------------------------------- -----分裂

第 1 部分是/^(.)([a-zA-Z0-9]*)([-_.])(.*)

第 1.1 部分是^(.)$1,第一个字符

第 1.2 部分是([a-zA-Z0-9]*)$2

第 1.3 部分是([_\\W])$3分隔符,忽略

第 1.4 部分是(.*)$4

-------------------------------------------------- -----更换

第 2 部分是/${1:/downcase}${2}${4:/pascalcase}/

第 2.1 部分${1:/downcase}→ 小写

第 2.2 部分${2}→ 正常

第 2.3 部分${4:/pascalcase}


for-bar.service.js → fooBarService


不够强大,但足够了。

于 2020-04-22T13:27:32.680 回答