Go言語正規表現
正規表現(Regular Expression、略してregexまたはregexp)は、文字列を照合するための強力なツールです。
正規表現はパターン(pattern)を定義することで、そのパターンに一致する文字列をすばやく検索、置換、抽出できます。詳細は以下を参照してください。正規表現チュートリアル。
Go言語では、正規表現はregexpパッケージによって実装されます。
Go言語におけるregexp 包
Go言語の標準ライブラリはregexpパッケージを提供しており、正規表現を処理します。以下はregexpパッケージでよく使われる関数とメソッド:
CompileとMustCompile
正規表現をコンパイルするために使用します。Compile返り値は*Regexpオブジェクトとエラーです。一方、MustCompileはコンパイルに失敗した場合、直接panicを引き起こします。MatchString
文字列が正規表現に一致するかどうかを確認します。FindStringとFindAllString
一致する文字列を検索するために使用します。FindString最初の一致項目を返し、FindAllStringすべての一致項目を返します。ReplaceAllString
一致する文字列を置換するために使用します。Split
正規表現に基づいて文字列を分割します。
正規表現の基本構文
以下はよく使われる正規表現の構文です:
.:任意の1文字に一致します(改行を除く)。*:直前の文字に0回以上一致します。+:直前の文字に1回以上一致します。?:直前の文字に0回または1回一致します。\d:数字文字に一致します(次と同等:[0-9])。\w:英数字またはアンダースコアに一致します(次と同等:[a-zA-Z0-9_])。\s:空白文字に一致します(スペース、タブ、改行などを含む)。[]:括弧内の任意の1文字に一致します(例:[abc]に一致します。a、b或c)。^:文字列の先頭に一致します。$:文字列の末尾に一致します。
サンプルコード
以下はGo言語の正規表現を使用したサンプルです:
例 1:文字列が正規表現に一致するか確認する
実例
import (
"fmt"
"regexp"
)
func main() {
pattern := `^[a-zA-Z0-9]+$`
regex := regexp.MustCompile(pattern)
str := "Hello123"
if regex.MatchString(str) {
fmt.Println("文字列は正規表現に一致します")
} else {
fmt.Println("文字列は正規表現に一致しません")
}
}
例 2:一致する文字列を検索する
実例
import (
"fmt"
"regexp"
)
func main() {
pattern := `\d+`
regex := regexp.MustCompile(pattern)
str := "私はリンゴを3個とバナナを5本持っています"
matches := regex.FindAllString(str, -1)
fmt.Println("見つかった数字:", matches)
}
例 3:一致する文字列を置換する
実例
import (
"fmt"
"regexp"
)
func main() {
pattern := `\s+`
regex := regexp.MustCompile(pattern)
str := "Hello World"
result := regex.ReplaceAllString(str, " ")
fmt.Println("置換後の文字列:", result)
}
例 4:文字列を分割する
実例
import (
"fmt"
"regexp"
)
func main() {
pattern := `,`
regex := regexp.MustCompile(pattern)
str := "apple,banana,orange"
parts := regex.Split(str, -1)
fmt.Println("分割後の文字列:", parts)
}
注意事項
パフォーマンス問題
正規表現のマッチングや置換操作は、特に大量のデータを処理する場合に多くのリソースを消費する可能性があります。パフォーマンスが重要な場面では慎重に使用することをお勧めします。エスケープ文字
Go言語では、正規表現中のバックスラッシュ\は次のように記述する必要があります:\\。なぜなら、バックスラッシュは文字列内でもエスケープ文字だからです。エラーハンドリング
を使用する場合Compile返されるエラーを必ず確認し、プログラムがクラッシュするのを防いでください。