Регулярное выражение фрагмента: сопоставить произвольное количество групп и преобразовать в CamelCase

В фрагменте кода 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' а также 'format', но я понятия не имею, что делать.

Как можно сопоставить произвольное количество вхождений паттернов?

1 ответ

Чтобы преобразовать произвольное количество слов, разделенных "_", в CamelCase, попробуйте:

"camelCase": {
    "prefix": "_cc",
    "body": [
            "${TM_FILENAME_BASE/([a-z]*)_+([a-z]*)/${1:/capitalize}${2:/capitalize}/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]*)_*([a-z]*)/$1${2:/capitalize}/g}"

Обратите внимание, что флаг "g" в конце делает большую часть этой работы за вас, чтобы получить как можно больше совпадений, помимо двух явно записанных.

Я оставил группы захвата как ([a-z]*) как у тебя Вы можете использовать ([A-Za-z0-9]*) для большей гибкости.

Преобразование фрагмента кода 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


Не достаточно сильно, но достаточно.

Другие вопросы по тегам