19

我想创建一个 VS 代码片段来创建 redux reducer。

我想要一个带有占位符的片段,它需要 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. 点击tab加载片段。
  3. 输入changeNetworkStatus结果:

    changeNetworkStatus -> changeNetworkStatus
    
  4. 命中tab以获得预期结果:

    changeNetworkStatus -> CHANGE_NETWORK_STATUS
    

如何更改我的代码段以获得所需的结果?

这是一个需要不同流程的相关解决方案。

4

1 回答 1

26

更新:键绑定版本

VScode 在 v1.53 中添加了editor.action.transformToSnakecase,因此可以更轻松地完成请求的操作,而无需找出必要的正则表达式来使其工作,如上一个答案所示。并且因为有些人可能会在寻找蛇盒(snake-case)信息时发现这个问题。

然而,我现在展示的不是片段。您只需键入文本,然后触发键绑定。键绑定本身从多命令扩展中触发宏扩展命令。在keybindings.json

      {
        "key": "alt+3",                        // whatever keybinding you wish
        "command": "extension.multiCommand.execute",
        "args": {
          "sequence": [
            "cursorWordLeftSelect",            // select word you just typed
            "editor.action.transformToSnakecase",
            "editor.action.transformToUppercase",
            // "cursorLineEnd"                   // if you want this
          ]
        },
        "when": "editorTextFocus && !editorHasSelection"
      },

按键绑定版本演示:

蛇案例演示


片段版本

"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}",

// here is an especially gnarly version to handle edge cases like 'thisISABCTest' and trailing _'s
       "${1} -> ${1/([a-z]+)(?=[A-Z])|([A-Z])(?=[A-Z])|([A-Z][a-z]+)(?=$)|([A-Z][a-z]+)|([a-z]+)(?=$)/${1:/upcase}${1:+_}$2${2:+_}${3:/upcase}${4:/upcase}${4:+_}${5:/upcase}/g}"
        
    ],
    "description": "underscore separators"
},

这适用于任何数量的驼峰式单词,从一到无穷大......

意思是“ ${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

使用regex101.com确实有助于可视化正在发生的事情!

于 2018-07-18T06:14:59.483 回答