BioErrorLog Tech Blog

試行錯誤の記録

Terraformで文字列を切り出す | substrの使い方

Terraformのsubstrを使って、文字列を切り出す/抽出するやり方を整理します。

はじめに

こんにちは、@bioerrorlogです。

substr関数を使えば、Terraformで文字列を切り出すことができます。

このsubstr関数の使い方で少し戸惑うことがあったので、今回は改めて使い方を整理します。

# 作業環境
$ terraform --version
Terraform v1.1.9

substrの使い方

基本の使い方

substrの基本的な使い方はドキュメントの通りです。

substr(string, offset, length)

第一引数stringに対象の文字列、第二引数offsetに開始地点、第三引数lengthに切り出す長さを指定します。 (第二引数の開始地点は0から始まることに注意)

# 使用例
> substr("Hello", 0, 3)
"Hel"
> substr("Hello", 1, 3)
"ell"
> substr("Hello", 1, 10)
"ello"

ここまでは非常にシンプルな話です。

マイナス値を活用する

少し頭を整理したいのは、offsetlengthにマイナス値を指定した際の挙動です。

まずはoffsetにマイナス値を指定してみます。

> substr("Hello", -2, 2)
"lo"
> substr("Hello", -3, 2)
"ll"
> substr("Hello", -4, 2)
"el"
> substr("Hello", -10, 2)
"He"

offsetにマイナス値を指定すると、第一引数の終端側から数えた地点が切り出しの開始地点になります。

では次にlengthをマイナス値に設定します。

# offset/lengthともにマイナス値
> substr("Hello", -1, -1)
"o"
> substr("Hello", -2, -1)
"lo"
> substr("Hello", -3, -1)
"llo"
> substr("Hello", -4, -1)
"ello"
> substr("Hello", -5, -1)
"Hello"

# lengthのみマイナス値
> substr("Hello", 0, -1)
"Hello"
> substr("Hello", 1, -1)
"ello"

# lengthのマイナス値の変化
> substr("Hello", -5, -2)
"Hello"
> substr("Hello", -5, -3)
"Hello"
> substr("Hello", -5, -4)
"Hello"

lengthをマイナス値に指定すると、offsetで指定された開始地点から対象文字列の終端までが切り出されます。

そしてこの挙動はlengthがマイナス値であることで判定されるため、そのマイナス値の大きさには関係ないようです。

確かに、-1以外のマイナス値が使われているのを見たことがありません。

おわりに

以上、Terraformのsubstr関数の使い方を整理しました。

最初はlengthのマイナス値指定の挙動が少し不思議に感じられましたが、慣れればシンプルに理解できます。

同じ違和感を感じたどなたかのお役に立てば幸いです。

[関連記事]

www.bioerrorlog.work

www.bioerrorlog.work

参考

substr - Functions - Configuration Language | Terraform | HashiCorp Developer

substr - Functions - Configuration Language | Terraform by HashiCorp

terraform/string.go at 7b4a5513a9d5719290c7d7a789f9d7067a8d183b · hashicorp/terraform · GitHub