Go言語で文字列を比較する方法を紹介します。基本的には組み込みのstringsパッケージで行います。また、過去に文字列の前方/後方一致と置換に注目した記事も書いてますので、そちらも合わせてご覧くださいませ。
Contents
完全一致:大文字/小文字も区別
まずは大文字/小文字を区別する完全一致から。こちらは素直に比較演算子”==”で行えます。「一致しない」ことをみたいなら”!=”演算子ですね。
package mainimport "fmt"func main(){ x := "Hello" y := "Hello" z := "heLLo" fmt.Println(x == y) // true fmt.Println(x == z) // false fmt.Println(x != z) // true}
ちなみにbyte, runeとstringの記事でも取り上げたように、文字は技術的にはUnicodeのコードポイント、つまり「コンピューテーショナルな(計算可能な)数値」として扱われるので、文字に対して不等号も使えます。
完全一致:ただし大/小文字は区別しない
大文字、小文字を区別せずに一致判定を行いたいときは、strings.EqualFoldが使えます。ただし、全角と半角とは区別されます。
package mainimport( "fmt" "strings")func main(){ x := "Hello" y := "Hello" z := "heLLo" n := "Hellо" // 全角のHello fmt.Println(strings.EqualFold(x, y)) // true fmt.Println(strings.EqualFold(x, z)) // true (大/小文字区別なし) fmt.Println(strings.EqualFold(x, n)) // false (全/半角区別あり)}
部分一致
文字列がある別の文字列を含んでいるかを判定するには、2つほど方法があります。
package mainimport ( "fmt" "strings")func main(){ parent := "Hello, world." child := "llo" non_child := "abc" fmt.Println(strings.Index(parent, child)) // 2(「0文字目」始まりの「2文字目」) fmt.Println(strings.Index(parent, non_child)) // -1 fmt.Println(strings.Contains(parent, child)) // true fmt.Println(strings.Contains(parent, non_child)) // false}
まずstrings.Index関数です。これは本来、与えた部分文字列が何文字目から始まっているかを知るための関数ですが、「存在しない部分文字列」を与えた時には-1を返すという挙動をします。これによって、特定の文字列を含むかどうか調べるという目的に応用できます。
2つ目はstrings.Contains関数です。こちらは第2引数に与えた文字列を第1引数の文字列が含むならばtrueを、含まなければfalseを返します。より「素直」な判定ですね。if節の分岐条件等、一般的な用途であれば、こちらで申し分ないかと思います。
大文字/小文字を区別しない部分一致は・・?
大文字/小文字を区別しない部分一致を行いたい場合について、あまり自信はないのですが、strings.ToLower関数で両方とも「全て小文字」にしてから比較すると良いのではと思います。
package mainimport ( "fmt" "strings")func main(){ parent := "helLO, world." child := "LLo" fmt.Println(strings.Contains(parent, child)) // false fmt.Println(strings.Contains(strings.ToLower(parent), strings.ToLower(child))) // true}