Reduxレデューサーを作成するためのVSコードスニペットを作成したいと思います。
CamelCaseを期待するプレースホルダーを含むスニペットを用意し、一致するプレースホルダーをSCREAMING_SNAKE_CASEに変換します。
これが機能していない私の試したスニペットです:
"test": {
"prefix": "test",
"body": "${1} -> ${1/([a-zA-Z])(?=[A-Z])/${1:/upcase}_/g}"
},
これにより、望ましくない結果が生成されます。
changeNetworkStatus -> changE_NetworK_Status
test
(スニペットの名前)changeNetworkStatus
と入力すると、次の結果になります。
changeNetworkStatus -> changeNetworkStatus
ヒット tab 期待される結果を得るには:
changeNetworkStatus -> CHANGE_NETWORK_STATUS
スニペットコードを変更して目的の結果を得るにはどうすればよいですか?
"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"
},
これは、1から無限大までの任意の数のcamelCaseワードで機能します...
${2:+_}
は、「キャプチャグループ2がある場合、アンダースコアを追加する」ことを意味します。 2番目のワード/キャプチャグループがない場合、グループ3と4はキャプチャグループ2内にあるため、とにかく空になります。キャプチャグループ2は常に次のワードです(1つの大文字で始まり、少なくとも1つの小文字が続く) )。
たとえば、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 を使用すると、実際に起こっていることを視覚化するのに役立ちます!