Goの文字列操作【プログラミング初心者向け教材】

プログラミング

プログラミングをしていると、文字列を結合したい、文字列を抽出したいということがありますが、「どう記述するんだっけ」といつも調べている方はいないでしょうか。

僕もその一人で、決して全部を覚える必要はないと思っているのですが、調べるにも時間はかかるので一度まとめてみることにしました。

本記事では、Goの文字列操作について、やりたい操作ごとにまとめてみました。

操作ごとにまとめているので、単なるメソッドの書き方だけでなく、該当するメソッドが直接ない場合にも、別の方法を含めて記載しています。

忘れた時に調べやすく、復習しやすいように心がけていますので、一人でも多くの方に役立てていただけたら幸いです。

なお、記載しているプログラムは、Go1.15.2を使って動作確認をしています。

Goの文字列操作

必要な文字列操作として、以下の内容をとりあげます。

  • 文字列を結合したい
  • 文字列を抽出したい
  • 文字列の長さを求めたい
  • 文字列を検索したい
  • 文字列を置換したい
  • 文字列を削除したい
  • 文字列を配列に分割したい
  • 文字列をトリミングしたい
  • 文字列をパディングしたい
  • 文字列を大文字・小文字に変換したい
  • 文字列を数値に変換したい
  • 数値を文字列に変換したい
  • 文字列が一致しているか確認したい

文字列を結合したい

最も単純なのは、演算子で結合する方法です。
数値と結合することはできません。

s1 := "Hello"
s2 := "Go"
r := s1 + s2
fmt.Println(r) // -> HelloGo

分割された配列の中身を結合したい場合は、joinを使います。
joinの第1引数に文字列同士の間に含めたい文字列を指定し、第2引数に配列を指定します。

a := []string{"Hello", "Go"}
r = strings.Join(a, " ")
fmt.Println(r) // -> Hello Go

Sprintfを使って、文字列に埋め込むことで結合のようにすることもできます。

s1 = "Hello"
s2 = "Go"
r = fmt.Sprintf("%s %s", s1, s2)
fmt.Println(r) // -> Hello Go

Builderを使って結合することもできます。

s1 = "Hello"
s2 = "Go"
var builder strings.Builder
builder.WriteString(s1)
builder.WriteString(s2)
r = builder.String()
fmt.Println(r) // -> HelloGo

文字列を抽出したい

文字列から一部を抽出するには、文字のインデックス(開始と終了)を指定することで切り出すことができます。
最初の文字はインデックス0から始まることに注意が必要です。
どちらかを省略することにより、以降全部や以前全部といった抽出をすることもできます。

s = "Hello Go"
r = s[6:8]
fmt.Println(r) // -> Go

文字列の長さを求めたい

文字列の長さを調べるには、len、RuneCountInStringを使います。

lenはバイト長を返します。
日本語などのマルチバイト文字が含まれる場合は、文字列長にならないので注意が必要です。

s = "Go言語"
rn = len(s)
fmt.Println(rn) // -> 8

RuneCountInStringは、マルチバイト文字を含めて文字列長を返します。
RuneCountInStringは、unicode/utf-8パッケージとなります。

s = "Go言語"
rn = utf8.RuneCountInString(s)
fmt.Println(rn) // -> 4

文字列を検索したい

文字列の中に、特定の文字列を含んでいるかどうかを検索するには、Contains、Index、Count、HasPrefix、HasSuffixを用いる方法があります。

Containsは指定した文字列が含まれていればtrueを返し、含まれていなければfalseを返します。

s = "Hello Go"
rb = strings.Contains(s, "Go")
fmt.Println(rb) // -> true

Indexは、文字列内に指定した文字列が最初に現れる位置のインデックスを返します。
存在しない場合は-1を返します。
後方から探す場合は、LastIndexを使います。

s = "Hello Go"
rn = strings.Index(s, "o")
fmt.Println(rn) // -> 4
s = "Hello Go"
rn = strings.LastIndex(s, "o")
fmt.Println(rn) // -> 7

Countは、文字列内に現れる回数を返します。

s = "Hello Go"
rn = strings.Count(s, "o")
fmt.Println(rn) // -> 2

HasPrefixは、文字列の先頭に指定した文字列が一致する場合にtrueを返し、一致しない場合にはfalseを返します。

s = "Hello Go"
rb = strings.HasPrefix(s, "Hello")
fmt.Println(rb) // -> true

HasSuffixは、文字列の末尾に指定した文字列が一致する場合にtrueを返し、一致しない場合にはfalseを返します。

s = "Hello Go"
rb = strings.HasSuffix(s, "Go")
fmt.Println(rb) // -> true

文字列を置換したい

文字列の置換は、replace、NewReplacerを使います。

replaceは、見つかった文字列を置換する文字列で置き換えます。
第3引数で置換する回数をしていすることができます。指定しない場合はすべての対象が置換されます。

s = "Hello Go??"
r = strings.Replace(s, "?", "!", 1)
fmt.Println(r) // -> Hello Go!?

ReplaceAllは見つかったすべての文字列を置換する文字列で置き換えます。

s = "Hello Go??"
r = strings.ReplaceAll(s, "?", "!")
fmt.Println(r) // -> Hello Go!!

NewReplacerは置換対象の文字列と置換後の文字列を交互に指定します。複数指定することも可能です。

s = "Hello Java??"
replacer := strings.NewReplacer("Java", "Go", "?", "!")
r = replacer.Replace(s)
fmt.Println(r) // -> Hello Go!!

文字列を削除したい

Goでは文字列を削除するための明示的な関数は用意されていません。
ですので、文字列の中から特定の文字列を削除(除去)するには、上記の置換を使って空文字に置き換える操作を行います。

s = "HelloGo"
r = strings.Replace(s, "Hello", "", -1)
fmt.Println(r) // -> Go

文字列を配列に分割したい

文字列を特定の文字で区切って配列にするには、Splitを使います。
CSVやTSVの各要素を配列に分割するような場面でよく使われます。
Splitはすべての区切り文字で分割しますが、SplitNを使うと分割の制限数を指定することができます。

s = "JavaScript,Python,Java,Ruby,Go"
ra := strings.Split(s, ",")
fmt.Println(ra) // -> [JavaScript Python Java Ruby Go]

文字列をトリミングしたい

文字列の中から前後の空白を削除(除去)するには、Trimを用います。
TrimにはTrimLeft、TrimRight、TrimPrefix、TrimSuffix、TrimSpaceといったたくさんの種類があります。

s = " Hello Go "
r = strings.Trim(s, " ")
fmt.Println(r) // -> 「Hello Go」

文字列をパディングしたい

文字列の前後に何かの文字を付加することをパディング(詰め物)と呼びます。
Goではパディングするための専用の関数は用意されていないため、Sprintfによる書式指定を使って行います。

s = "123"
r = fmt.Sprintf("%010s", s)
fmt.Println(r) // -> 0000000123

文字列を大文字・小文字に変換したい

文字列をすべて大文字に変換するには、ToUpperを使います。

s = "Hello Go"
r = strings.ToUpper(s)
fmt.Println(r) // -> HELLO GO

文字列をすべて小文字に変換するには、ToLowerを使います。

s = "Hello Go"
r = strings.ToLower(s)
fmt.Println(r) // -> hello go

タイトルケース(単語の先頭文字を大文字)に変換するには、Titleを使います。

s = "hello go"
r = strings.Title(s)
fmt.Println(r) // -> Hello Go

文字列を数値に変換したい

文字列を数値に変換するには、strconvパッケージのAtoiを使います。
Atoiは2つの戻り値を返します。1つ目が変換後の値で、2つ目にエラー情報を返します。
変換に成功したかどうかは、エラー情報がnilでないかどうかを確認することで判定します。

s = "123"
rn, _ = strconv.Atoi(s)
fmt.Println(rn) // -> 123
fmt.Println(reflect.TypeOf(rn)) // -> int

数値を文字列に変換したい

数値を文字列に変換するには、strconvパッケージのItoaを使います。

n = 123
r = strconv.Itoa(n)
fmt.Println(r) // -> 123
fmt.Println(reflect.TypeOf(r)) // -> string

文字列が一致しているか確認したい

文字列同士が一致しているかどうかは、==、EqualFold、Compareを使う方法があります。

==は、文字列が一致している場合はtrueを返し、一致していない場合はfalseを返します。

s1 = "Go"
s2 = "Go"
rb = s1 == s2
fmt.Println(rb) // -> true

EqualFoldは、大文字小文字区別せずに比較します。

s1 = "Go"
s2 = "go"
rb = strings.EqualFold(s1, s2)
fmt.Println(rb) // -> true

comparaToは辞書順に従って比較を行い、一致している場合は0、辞書順で前になる場合は負の値、辞書順で後になる場合は正の値を返します。

s1 = "Go"
s2 = "Go"
rn = strings.Compare(s1, s2)
fmt.Println(rn) // -> 0

様々なメソッドを使いこなせるようになろう

実際の開発現場でも今回紹介した文字列操作はよく使われます。

どの言語でも文字列を操作するための便利な機能はたくさん用意されています。

これらをできるだけ使うことで、生産性の向上、ミスの削減、読みやすいコードへつなげることができ、プログラマーとしても成長することができます。

今回は、Goの文字列操作についてまとめてみました。

参考になれば幸いです。

コメント

タイトルとURLをコピーしました