Copyright © 2023 - All right reserved by Junpei K.

Photo by Martin Sanchez

    🖌️ Table of Contents

    🖌️ TOC

  1. 完全一致:大文字...
    完全一致:...
  2. 完全一致:ただし...
    完全一致:...
  3. 部分一致
    部分一致
  4. 大文字/小文字を...
    大文字/小...
  5. 参考
    参考

Goで文字列を比較する手法あれこれ(完全一致/部分一致)

Go言語で文字列を比較する方法をまとめていく。

完全一致:大文字/小文字も区別

まずは大文字/小文字を区別する完全一致から。これは素直に比較演算子"=="で行える。「一致しない」ことをみたいなら"!="演算子で。

1package main
2
3import "fmt"
4
5func main(){
6    x := "Hello"
7    y := "Hello"
8    z := "heLLo"
9    
10    fmt.Println(x == y) // true
11    fmt.Println(x == z) // false
12    fmt.Println(x != z) // true
13}
14

ちなみにgolangにおいて文字は技術的にはUnicodeのコードポイント、つまり「コンピューテーショナルな(計算可能な)数値」として扱われるので、文字に対して不等号も使える。

完全一致:ただし大/小文字は区別しない

大文字、小文字を区別せずに一致判定を行いたいときは、strings.EqualFoldが利用できる。ただし、全角と半角とはこの方法でも区別される。

1package main
2
3import(
4    "fmt"
5    "strings"
6)
7
8func main(){
9    x := "Hello"
10    y := "Hello"
11    z := "heLLo"
12    
13    n := "Hellо" // 全角のHello
14    
15    fmt.Println(strings.EqualFold(x, y)) // true
16    fmt.Println(strings.EqualFold(x, z)) // true (大/小文字区別なし)
17    fmt.Println(strings.EqualFold(x, n)) // false (全/半角区別あり)
18}
19

部分一致

文字列がある別の文字列を含んでいるかを判定するには、2つほど方法がある。

1package main
2import (
3    "fmt"
4    "strings"
5)
6
7func main(){
8    parent := "Hello, world."
9    child  := "llo"
10    non_child := "abc"
11    
12    fmt.Println(strings.Index(parent, child))     // 2(「0文字目」始まりの「2文字目」)
13    fmt.Println(strings.Index(parent, non_child)) // -1
14    
15    fmt.Println(strings.Contains(parent, child))     // true
16    fmt.Println(strings.Contains(parent, non_child)) // false
17}
18

まずstrings.Index関数。これは本来、与えた部分文字列が何文字目から始まっているかを知るための関数だが、「存在しない部分文字列」を与えた時には-1を返すという挙動をする。この仕様は、特定の文字列を含むかどうか調べるという目的に応用できる。

2つ目はstrings.Contains関数だ。こちらは第2引数に与えた文字列を第1引数の文字列が含むならばtrueを、含まなければfalseを返す。より「素直」な判定だろう。if節の分岐条件等、一般的な用途であれば、こちらで申し分ないかと思う。

大文字/小文字を区別しない部分一致は・・?

大文字/小文字を区別しない部分一致を行いたい場合について、あまり自信はないのだが、strings.ToLower関数で両方とも「全て小文字」にしてから比較すると良いのではと思う。

1package main
2import (
3    "fmt"
4    "strings"
5)
6
7func main(){
8    parent := "helLO, world."
9    child  := "LLo"
10    
11    fmt.Println(strings.Contains(parent, child))     // false
12    fmt.Println(strings.Contains(strings.ToLower(parent), strings.ToLower(child))) // true
13}
14

参考

  • [Golang] String(文字列) - GolangでString(文字列)を宣言して使う方法に説明します。
  • strings.EqualFold 関数を使え | text.Baldanders.info
  • 文字列の前方/後方一致と置換