Snippet regex: match arbitrary number of groups and transform to CamelCase

后端 未结 2 516
[愿得一人]
[愿得一人] 2020-12-06 14:16

In a Visual Studio Code Snippet I\'m writing I want to convert a snake case string to camel case.

From the docs I know that the syntax is

\'${\' var         


        
相关标签:
2条回答
  • 2020-12-06 14:49

    vs code snippet transform to camelCase:

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

    wrapper is ${1:},

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

    wrapper is ${}

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

    string is TM_FILENAME_BASE

    -------------------------------------------------------split

    part 1 is /^(.)([a-zA-Z0-9]*)([-_.])(.*)

    part 1.1 is ^(.)$1, first character

    part 1.2 is ([a-zA-Z0-9]*)$2

    part 1.3 is ([_\\W])$3, delimiter, ignore

    part 1.4 is (.*)$4

    -------------------------------------------------------replace

    part 2 is /${1:/downcase}${2}${4:/pascalcase}/

    part 2.1 ${1:/downcase} → lowercase

    part 2.2 ${2} → normal

    part 2.3 ${4:/pascalcase}


    for-bar.service.js → fooBarService


    Not strong enough, but enough.

    0 讨论(0)
  • 2020-12-06 15:09

    To transform an arbitrary number of "_" separated words into CamelCase try:

    EDIT: In October, 2018 (but not yet added to snippet grammar documentation as of February, 2020) vscode added the /pascalcase transform, see commit. I have modified the code below to use the /pascalcase transform. It only works for the some_file => SomeFile type of CamelCase though.

    But it works with many characters as separators, these all work:

    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

    [I assume CamelCase is the form you want, there are others, such as camelCase.]

    For camelCase:

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

    put your desired list of separators in the [-@_.*0-9]+ part. The + quantifier allows you to use carrot--cake for example - multiple separators between words. Thanks to the other answer for using the [list the separators] part of the regex.

    Note that the "g" flag at the end is doing most of that work for you in getting however many matches there are beyond the two explicitly captured.

    I left the capture groups as ([a-z]*) as you had them. You may want to use ([A-Za-z0-9]*) for more flexibility.

    0 讨论(0)
提交回复
热议问题