Код VS: Как преобразовать заполнитель фрагмента из camelCase в SCREAMING_SNAKE_CASE?

Я хотел бы создать фрагмент кода VS для создания редукционных редукторов.

Я хотел бы иметь фрагмент с заполнителем, который ожидает camelCase, а затем преобразовать соответствующий заполнитель в SCREAMING_SNAKE_CASE.

Вот мой попытанный фрагмент, который не работает:

"test": {
    "prefix": "test",
    "body": "${1} -> ${1/([a-zA-Z])(?=[A-Z])/${1:/upcase}_/g}"
},

Который дает нежелательный результат:

changeNetworkStatus -> changE_NetworK_Status

Желаемый поток

  1. тип test (название фрагмента)
  2. нажмите вкладку, чтобы загрузить фрагмент.
  3. тип changeNetworkStatus в результате:

    changeNetworkStatus -> changeNetworkStatus
    
  4. нажмите вкладку, чтобы получить ожидаемый результат:

    changeNetworkStatus -> CHANGE_NETWORK_STATUS
    

Как я могу изменить мой фрагмент кода, чтобы получить желаемый результат?

Вот связанное решение, которое требует другого потока.

1 ответ

Решение
"camelCaseModify": {
    "prefix": "test",       
    "body": [

       //  first inefficient try, works for up to three words
       //  "${1} -> ${1/^([a-z]*)([A-Z])([a-z]+)*([A-Z])*([a-z]+)*/${1:/upcase}_$2${3:/upcase}${4:+_}$4${5:/upcase}/g}"

       "${1} -> ${1/([a-z]*)(([A-Z])+([a-z]+))?/${1:/upcase}${2:+_}$3${4:/upcase}/g}"           
    ],
    "description": "underscore separators"
},

Это работает с любым количеством слов camelCase, от одного до бесконечности...

${2:+_} означает "если есть группа захвата 2, то добавьте подчеркивание". Если нет второго слова / группы захвата, то группы 3 и 4 будут в любом случае пустыми, поскольку они находятся в группе захвата 2. Группа захвата 2 всегда является следующим словом (которое начинается с одной заглавной буквы и сопровождается хотя бы одной маленькой буквой).

например, используя changeNetworkStatus:

Match 1

Full match    0-13    `changeNetwork`
Group 1.      0-6     `change`
Group 2.      6-13    `Network`
Group 3.      6-7     `N`
Group 4.      7-13    `etwork`

Match 2

Full match    13-19    `Status`
Group 1.      13-13     ``
Group 2.      13-19     `Status`
Group 3.      13-14     `S`
Group 4.      14-19     `tatus`

Match 3

Full match    19-19    ``
Group 1.      19-19    ``

Пример вывода:

abcd -> ABCD
twoFish -> TWO_FISH
threeFishMore -> THREE_FISH_MORE
fourFishOneMore -> FOUR_FISH_ONE_MORE
fiveFishTwoMoreFish -> FIVE_FISH_TWO_MORE_FISH
sixFishEelsSnakesDogsCatsMiceRatsClocksRocks -> SIX_FISH_EELS_SNAKES_DOGS_CATS_MICE_RATS_CLOCKS_ROCKS

Использование https://regex101.com/ действительно помогает визуализировать происходящее!

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