🪰

Go で文字列操作:strings パッケージを使いこなす

2022/03/23に公開

Go の標準パッケージである strings パッケージには主に文字列操作の機能がまとめられています。
今回はその中で、特によく使う機能をピックアップして紹介します。

import "strings"

文字列結合:strings.Join()

文字列を要素にもつスライスなどに使用し、要素同士を任意の文字で埋めます(空文字を指定すれば純粋に結合します)

// 文字列を要素にもつスライス
slice := make([]string{"a", "b", "c"}, 3)

strings.Join(slice, "---")  // "a---b---c"
strings.Join(slice, "")  // "abc"

文字列分割:

  • strings.Split()
  • strings.SplitAfter()
  • strings.SplitN()

戻り値は []string型 になります

// 指定の文字で区切る(指定された文字の直後から、次に指定の文字が出てくるまでの箇所を切り取る)
strings.Split("a,b,c,d,e", ",")  // ["a" "b" "c" "d" "e"]
strings.Split("a, b, c, d, e", ",")  // ["a" " b" " c" " d" " e"]

// 指定の文字を含めながらその直後で区切る
strings.SplitAfter("a,b,c,d,e", ",")  // ["a," "b," "c," "d," "e"]
strings.SplitAfter("a, b, c, d, e", ",")  // ["a," " b," " c," " d," " e"]

// 指定の文字で指定の数未満の回数だけ区切る
strings.SplitN("a,b,c,d,e", ",", 3)  // ["a" "b" "c,d,e"]

文字を繰り返して結合する:strings.Repeat()

strings.Repeat("abcde", 2)  // "abcdeabcde"
strings.Repeat("abcde", 0)  // ""

文字列置換:strings.Replace()

strings.Replace(対象の文字列, どの文字を変えるか, 変える文字, 何文字変えるか)

strings.Replace("AAAAA", "A", "X", 1)  // "XAAAA"
strings.Replace("AAAAA", "A", "X", 2)  // "XXAAA"
strings.Replace("AAAAA", "A", "X", -1)  // "XXXXX"

strings.Replace("Java", "Java", "C++", 1)  // "C++"

大文字・小文字の変換:

  • strings.ToLower()
  • strings.ToUpper()
// 小文字にする
strings.ToLower("ABCDE")  // "abcde"
strings.ToLower("X Y Z")  // "x y z"

// 大文字にする
strings.ToUpper("abcde")  // "ABCDE"
strings.ToUpper("x y z")  // "X Y Z"

文字列から空白を取り除く:strings.TrimSpace()

全角スペースも同様に取り除かれます

strings.TrimSpace("     Hello!  ")  // "Hello!"
strings.TrimSpace("     ←全角スペース→  ")  // "←全角スペース→"

検索

最初に一致する箇所のインデックスを確認:strings.Index()

文字列内の、最初に指定文字に一致する箇所のインデックスを取得します

strings.Index("abcdea", "a")  // 0
strings.Index("abccdec", "c")  // 2

// 一致しない場合「-1」を返す
strings.Index("abcde", "aok")  // -1
strings.Index("abcde", "x")  // -1

最後に一致する箇所のインデックスを確認:strings.LastIndex()

文字列内の、最後に指定文字に一致する箇所のインデックスを取得します

strings.LastIndex("abcdeabcde", "a")  // 5
strings.LastIndex("abcdeabcde", "bc")  // 6

// 一致しない場合「-1」を返す
strings.LastIndex("abcde", "aok")  // -1
strings.LastIndex("abcde", "x")  // -1

部分一致する箇所のインデックスを確認:strings.IndexAny()

文字列内で、指定文字のうち一文字でも一致すればその箇所のインデックスを取得する
複数ある場合はその中で最も若いインデックスが返却される

strings.IndexAny("abcde", "afh")  // 0
strings.IndexAny("abcdec", "cwi")  // 2
strings.IndexAny("abcde", "cawi")  // 0

// 一致しない場合「-1」を返す
strings.IndexAny("abcde", "ok")  // -1
strings.IndexAny("abcde", "x")  // -1

指定した文字列が含まれるか確認:

全体一致:strings.Contains()

strings.Contains("abcde", "abc")  // true
strings.Contains("アイウエオ", "アイウ")  // true
strings.Contains("abcde", "xxx")  // false

strings.Contains("abcde", "")  // true
strings.Contains("", "")  // true

部分一致:strings.ContainsAny()

指定した文字の一つでも一致するかどうかの判定

strings.ContainsAny("abcde", "asf")  // true
strings.ContainsAny("アイウエオ", "アジヘ")  // true
strings.ContainsAny("abcde", "xax")  // true
strings.ContainsAny("abcde", "xxx")  // false

strings.ContainsAny("abcde", "")  // true
strings.ContainsAny("", "")  // true

指定した文字列から始まるか確認:strings.HasPrefix()

strings.HasPrefix("Go言語", "Go")  // true
strings.HasPrefix("Go言語", "言語")  // false

指定した文字列が使われている回数を数える:strings.Count()

strings.Count("abcde", "abc")  // 1
strings.Count("abcabcabc", "abc")  // 3
strings.Count("abcabcabc", "xxx")  // 0

strings.Count("abcde", "")  // 6

Discussion