Go言語の標準ライブラリを触ってみる-“strings”

はじめに

こんにちは!今回は Go 言語の標準ライブラリライブラリである "strings" について紹介します。

皆さん、文字列操作で頻繁に使うライブラリといえば何が思い浮かびますか?
Go 言語では、標準パッケージに含まれる "strings" が文字列操作に特化したライブラリです。
"strings" を使いこなせば、文字列操作がより簡単便利になること間違いありません。
この記事では、様々な関数をサンプルコードとともに解説していきます。

標準ライブラリ的な検索や置換から、正規表現を使った高度な操作まで、幅広くカバーしています。

また、ライブラリの使い方だけでなく、実際にコードを書いてみることで理解を深めることができます。
この記事を通して、Go 言語の文字列処理ライブラリを扱うスキルアップを目指しましょう!

それでは、早速 "strings" の世界を覗いてみましょう。

検証環境

$ go version
go version go1.20.2 darwin/arm64

標準ライブラリ "strings" とは?

Go 言語の標準ライブラリである"strings"は、文字列関連の操作を提供するパッケージです。
以下は、strings パッケージの主な機能・特徴です。

  • 文字列の比較、切り出し、置換、連結などの基本的な操作を提供します。
  • 大文字・小文字の変換、空白文字のトリム ( 削除 ) や分割、パディング ( 埋め合わせ ) など、多様な文字列処理をサポートします。
  • UTF-8 エンコードに対応しているため、Unicode 文字列にも対応します。
  • 他の Go 言語の標準パッケージと同様に、高速に動作するように設計されています。

strings パッケージは、多くの Go アプリケーションで利用される基本的な機能を提供しており、文字列処理に関わる開発者にとっては非常に便利なツールです。

使い方

"strings" パッケージをインポートします。
コードの上部に以下の import 構文を記述します。

import "strings"

利用頻度が高そうな関数

個人的に利用頻度が高そうだなと思う関数について機能とサンプルコードを紹介します。

Contains : 指定された文字列を含むかチェック

指定された文字列を含んでいれば true、含んでいなければ false を返します。

全角文字 ( マルチバイト文字 ) を含んでいても、正しく動作します。

package main

import (
    "fmt"
    "strings"
)

func main() {
    s1 := "Hello"
    s2 := "World"
    s3 := "Hello,世界san"

    fmt.Println(strings.Contains(s1, "lo"))    // true
    fmt.Println(strings.Contains(s2, "lo"))    // false
    fmt.Println(strings.Contains(s3, "世界"))    // true
    fmt.Println(strings.Contains(s3, "o,世"))   // true
    fmt.Println(strings.Contains(s3, "世界san")) // true
}

ContainsAny : 指定された文字列のいずれかを含むかチェック

指定された文字列のいずれか 1 文字を含んでいれば true を返します。

package main

import (
    "fmt"
    "strings"
)

func main() {
    s1 := "Hello,世界san"

    // e が合致
    fmt.Println(strings.ContainsAny(s1, "ez"))   // true
    // 合致しない
    fmt.Println(strings.ContainsAny(s1, "yz"))   // false
    // 合致しない
    fmt.Println(strings.ContainsAny(s1, "宇宙"))   // false
    // 世 が合致
    fmt.Println(strings.ContainsAny(s1, "世捨て人")) // true
}

Count : 指定された文字列の登場回数を返するように

指定された文字列の並びが何回登場するかを調べます。

全角文字にも対応しています。

package main

import (
    "fmt"
    "strings"
)

func main() {
    s1 := "ora ora おら ora おら ora"

    fmt.Println(strings.Count(s1, "ora ")) // 3
    fmt.Println(strings.Count(s1, "o"))    // 4
    fmt.Println(strings.Count(s1, "おら"))   // 2
    fmt.Println(strings.Count(s1, "ら o"))  // 2
}

HasPrefix : 指定された文字列で始まっているかをチェック

指定された文字列で開始していれば true を返します。

package main

import (
    "fmt"
    "strings"
)

func main() {
    obj1 := "001/001"
    obj2 := "001/002"
    obj3 := "002/001"

    fmt.Println(strings.HasPrefix(obj1, "001")) // true
    fmt.Println(strings.HasPrefix(obj2, "001")) // true
    fmt.Println(strings.HasPrefix(obj3, "001")) // false
}

Index : 指定された文字列が含まれる位置を返す

指定された文字列が登場する位置を返します。
先頭で検出された場合は 0 が返却されます。
また、検出されなかった場合には -1 が返却されます。

package main

import (
    "fmt"
    "strings"
)

func main() {
    fmt.Println(strings.Index("chicken", "ken")) // 4
    fmt.Println(strings.Index("chicken", "dmr")) // -1
}

Join : スライスを連結する

スライスを指定された区切り文字で連結した結果、単一の文字列を返します。

package main

import (
    "fmt"
    "strings"
)

func main() {
    s := []string{"foo", "bar", "baz"}
    fmt.Println(strings.Join(s, ", ")) // foo, bar, baz

    fmt.Println(strings.Join([]string{"吾輩", "猫である"}, "は")) // 吾輩は猫である
}

ReplaceAll : 文字列を置換する

strings.ReplaceAll 関数は、文字列中の文字列を置換するための関数です。

package main

import (
    "fmt"
    "strings"
)

func main() {
    text := "ora ora おら ora おら ora"

    // "ora" を "おら" に置換
    fmt.Println(strings.ReplaceAll(text, "ora", "おら")) // おら おら おら おら おら おら
    // "おら" を "ora" に置換
    fmt.Println(strings.ReplaceAll(text, "おら", "ora")) // ora ora ora ora ora ora
}

Split : 文字列を「区切り文字」で分割

指定された文字列を「区切り文字」として利用し、文字列を分割します。

結果をスライスとして返します。

特殊ケースとして以下の2ケースに触れておきます。

  • 区切り文字が空ではないが見つからなかった場合 : 1要素だけを持つスライスが返却されます
  • 区切り文字が空だった場合 : 1文字ずつの要素となったスライスが返却されます
package main

import (
    "fmt"
    "strings"
)

func main() {
    text := "no music, no life. no life, no music."

    // ["" " music, " " life. " " life, " " music."]
    fmt.Printf("%q\n", strings.Split(text, "no"))

    // ["no music, no life. no life, no music."]
    fmt.Printf("%q\n", strings.Split(text, "hello"))

    // ["n" "o" " " "m" "u" "s" "i" "c" "," " " "n" "o" " " "l" "i" "f" "e" "." " " "n" "o" " " "l" "i" "f" "e" "," " " "n" "o" " " "m" "u" "s" "i" "c" "."]
    fmt.Printf("%q\n", strings.Split(text, ""))

    // [""]
    fmt.Printf("%q\n", strings.Split("", "hello world"))
}

ToLower : 大文字を小文字に変換する

大文字を小文字に変換します。
全角のアルファベットも大文字を小文字に変換します。

package main

import (
    "fmt"
    "strings"
)

func main() {
    fmt.Println(strings.ToLower("Gopher"))  // gopher
    fmt.Println(strings.ToLower("XXX"))     // xxx
    fmt.Println(strings.ToLower("xXx YyY")) // xxx yyy
    fmt.Println(strings.ToLower("ABC"))     // abc
    fmt.Println(strings.ToLower("アイウ"))     // アイウ
    fmt.Println(strings.ToLower("123"))     // 123
}

ToUpper : 小文字を大文字に変換する

小文字を大文字に変換します。
全角のアルファベットも小文字を大文字に変換します。

package main

import (
    "fmt"
    "strings"
)

func main() {
    fmt.Println(strings.ToUpper("Gopher"))  // GOPHER
    fmt.Println(strings.ToUpper("xxx"))     // XXX
    fmt.Println(strings.ToUpper("xXx YyY")) // XXX YYY
    fmt.Println(strings.ToUpper("abc"))     // ABC
    fmt.Println(strings.ToUpper("アイウ"))     // アイウ
    fmt.Println(strings.ToUpper("123"))     // 123
}

TrimSpace : 文字列の前後からスペースを取り除くの

文字列の前後からスペースを取り除きます。
ここでのスペースとは、空白文字、タブ、改行、キャリッジリターンを指します。

package main

import (
    "fmt"
    "strings"
)

func main() {
    fmt.Println(strings.TrimSpace(" \t\n Hello, Gophers \n\t\r\n")) // "Hello, Gophers"
}

ひとこと

標準ライブラリ "strings" にはまだまだ関数がありますが、今回紹介したものを覚えておけばプログラミングの多くのケースに対応できるはずです。

Posted by genzouw