regex 代码段正则表达式:匹配任意数量的组并转换为CamelCase

lf5gs5x2  于 2023-01-27  发布在  其他
关注(0)|答案(2)|浏览(91)

在我正在编写的Visual Studio代码段中,我想将snake大小写字符串转换为camel大小写。
从文档中我知道语法是

'${' 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”),而我希望处理具有任意数量元素的字符串(“bluebruy_pie_with_a_cup_of_coffee”)。
我猜想在'regex''format'中需要某种递归,但是我不知道该怎么做。
如何匹配任意数量的阵列引用?

bpzcxfmw

bpzcxfmw1#

    • 更新**

vscode v1.75添加了一个Transform to Camel Case命令,因此您可以选择结果并触发该命令,而不是使用代码片段转换。

    • 更新**

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,请尝试:

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

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

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]*)以获得更大的灵活性。

x6h2sr28

x6h2sr282#

vs代码段转换为camelCase

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

Package 器是${1:}
内部为${TM_FILENAME_BASE/^(.)([a-zA-Z0-9]*)([-_.])(.*)/${1:/downcase}${2}${4:/pascalcase}/}
Package 为${}
内部为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}
服务条→ fooBar服务
不够强,但足够了。

相关问题