$snake = "get_current_directory"
# スネークケースからキャメルケースに変換
$camel = ([regex]"_([a-z])").Replace($snake, {
$args[0].Groups[1].Value.ToUpper()
})
echo $camel #=> "getCurrentDirectory"
$camel = "getCurrentDirectory"
# キャメルケースからスネークケースに変換
$snake = ([regex]"[A-Z]").Replace($camel, {
"_" + $args[0].Groups[0].Value.ToLower()
})
echo $snake #=> "get_current_directory"
-
[regex]
で文字列をSystem.Text.RegularExpressions.Regex
オブジェクトに変換する。 -
{}
で囲まれている部分はスクリプトブロックと呼ばれ、複数の処理を一つにまとめられる。スクリプトブロックは値として扱える。つまり、変数に格納できるし、メソッドの引数として渡すこともできる。イメージ的には高階関数、ラムダ式のようなもの。今回はRegex.Replace
メソッドの第二引数にスクリプトブロックを渡している。 - スクリプトブロック呼び出し時のパラメータは、
$args
配列に格納されている。 -
Regex.Replace
メソッドには、第一引数に置換対象文字列を、第二引数にMatchEvaluator
オブジェクトを受け取るものがある。今回はそれを使用している。PowerShellがどのようにしてスクリプトブロックをMatchEvaluator
オブジェクトに変換しているかは不明。
下は、キャメルケース⇔スネークケースのコマンドレット。文字列は引数として与えてもいいし、パイプラインで与えてもいい。
function ConvertCamelToSnake
{
param
(
[Parameter(ValueFromPipeline=$true)]
[string]
$String
)
process
{
([regex]"[A-Z]").Replace($String, {
"_" + $args[0].Groups[0].Value.ToLower()
})
}
}
function ConvertSnakeToCamel
{
param
(
[Parameter(ValueFromPipeline=$true)]
[string]
$String
)
process
{
([regex]"_([a-z])").Replace($String, {
$args[0].Groups[1].Value.ToUpper()
})
}
}