Go言語正規表現

正規表現(Regular Expression、略してregexまたはregexp)は、文字列を照合するための強力なツールです。

正規表現はパターン(pattern)を定義することで、そのパターンに一致する文字列をすばやく検索、置換、抽出できます。詳細は以下を参照してください。正規表現チュートリアル。

Go言語では、正規表現はregexpパッケージによって実装されます。


Go言語におけるregexp 包

Go言語の標準ライブラリはregexpパッケージを提供しており、正規表現を処理します。以下はregexpパッケージでよく使われる関数とメソッド:

  1. CompileとMustCompile
    正規表現をコンパイルするために使用します。Compile返り値は*Regexpオブジェクトとエラーです。一方、MustCompileはコンパイルに失敗した場合、直接panicを引き起こします。

  2. MatchString
    文字列が正規表現に一致するかどうかを確認します。

  3. FindStringとFindAllString
    一致する文字列を検索するために使用します。FindString最初の一致項目を返し、FindAllStringすべての一致項目を返します。

  4. ReplaceAllString
    一致する文字列を置換するために使用します。

  5. Split
    正規表現に基づいて文字列を分割します。


正規表現の基本構文

以下はよく使われる正規表現の構文です:

  • .:任意の1文字に一致します(改行を除く)。
  • *:直前の文字に0回以上一致します。
  • +:直前の文字に1回以上一致します。
  • ?:直前の文字に0回または1回一致します。
  • \d:数字文字に一致します(次と同等:[0-9])。
  • \w:英数字またはアンダースコアに一致します(次と同等:[a-zA-Z0-9_])。
  • \s:空白文字に一致します(スペース、タブ、改行などを含む)。
  • []:括弧内の任意の1文字に一致します(例:[abc]に一致します。a、b 或 c)。
  • ^:文字列の先頭に一致します。
  • $:文字列の末尾に一致します。

サンプルコード

以下はGo言語の正規表現を使用したサンプルです:

例 1:文字列が正規表現に一致するか確認する

実例

package main

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:一致する文字列を検索する

実例

package main

import (
    "fmt"
    "regexp"
)

func main() {
    pattern := `\d+`
    regex := regexp.MustCompile(pattern)

    str := "私はリンゴを3個とバナナを5本持っています"
    matches := regex.FindAllString(str, -1)
    fmt.Println("見つかった数字:", matches)
}

例 3:一致する文字列を置換する

実例

package main

import (
    "fmt"
    "regexp"
)

func main() {
    pattern := `\s+`
    regex := regexp.MustCompile(pattern)

    str := "Hello    World"
    result := regex.ReplaceAllString(str, " ")
    fmt.Println("置換後の文字列:", result)
}

例 4:文字列を分割する

実例

package main

import (
    "fmt"
    "regexp"
)

func main() {
    pattern := `,`
    regex := regexp.MustCompile(pattern)

    str := "apple,banana,orange"
    parts := regex.Split(str, -1)
    fmt.Println("分割後の文字列:", parts)
}

注意事項

  1. パフォーマンス問題
    正規表現のマッチングや置換操作は、特に大量のデータを処理する場合に多くのリソースを消費する可能性があります。パフォーマンスが重要な場面では慎重に使用することをお勧めします。

  2. エスケープ文字
    Go言語では、正規表現中のバックスラッシュ\は次のように記述する必要があります:\\。なぜなら、バックスラッシュは文字列内でもエスケープ文字だからです。

  3. エラーハンドリング
    を使用する場合Compile返されるエラーを必ず確認し、プログラムがクラッシュするのを防いでください。

その他の拡張