Регулярное выражение фрагмента: сопоставить произвольное количество групп и преобразовать в 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
Не достаточно сильно, но достаточно.