Caution
お使いのブラウザはJavaScriptが実行できない状態になっております。
当サイトはWebプログラミングの情報サイトの為、
JavaScriptが実行できない環境では正しいコンテンツが提供出来ません。
JavaScriptが実行可能な状態でご閲覧頂くようお願い申し上げます。
regexp パッケージ
Goの『regexp』パッケージを使うと正規表現によるパターンマッチ・文字列の検索・置換を行えます。『regexp.Compile()』または『regexp.MustCompile()』で正規表現オブジェクトを作成してから使います。
構文
import "regexp"
// 正規表現をコンパイルします(エラーを返します)。
re, err := regexp.Compile(`\d+`)
// パニックして終了する版です(起動時の初期化に向いています)。
re := regexp.MustCompile(`\d+`)
// パターンが文字列中に存在するか確認します。
ok := re.MatchString("hello123") // true
// 最初にマッチした文字列を返します。
s := re.FindString("abc123def456") // "123"
// すべてのマッチを返します(nは最大数、-1で全件)。
all := re.FindAllString("123 and 456", -1) // ["123", "456"]
// マッチした箇所を置換します。
result := re.ReplaceAllString("abc123def456", "NUM")
メソッド一覧
| メソッド | 概要 |
|---|---|
| regexp.Compile(expr) | 正規表現をコンパイルしRegexpとエラーを返します。 |
| regexp.MustCompile(expr) | コンパイルに失敗するとpanicします(初期化時向き)。 |
| regexp.MatchString(pattern, s) | コンパイルなしで直接マッチを確認します。 |
| re.MatchString(s) | 文字列がパターンにマッチするかを返します。 |
| re.FindString(s) | 最初にマッチした文字列を返します(なければ"")。 |
| re.FindAllString(s, n) | n件分のマッチをスライスで返します(-1で全件)。 |
| re.FindStringSubmatch(s) | マッチ全体とキャプチャグループを返します。 |
| re.FindStringIndex(s) | 最初のマッチの位置[開始, 終了]を返します。 |
| re.ReplaceAllString(s, repl) | すべてのマッチをreplに置換します。 |
| re.ReplaceAllStringFunc(s, fn) | すべてのマッチを関数の戻り値で置換します。 |
| re.Split(s, n) | パターンで文字列を分割してスライスを返します。 |
サンプルコード
package main
import (
"fmt"
"regexp"
)
func main() {
// 基本的なマッチ確認です。
re := regexp.MustCompile(`\d+`)
fmt.Println("'abc123'に数字あり:", re.MatchString("abc123"))
fmt.Println("'abcdef'に数字あり:", re.MatchString("abcdef"))
fmt.Println()
// 最初のマッチを取得します。
text := "価格は1200円、割引は300円です。"
fmt.Println("最初の数字:", re.FindString(text))
// すべてのマッチを取得します。
all := re.FindAllString(text, -1)
fmt.Println("すべての数字:", all)
fmt.Println()
// キャプチャグループを使います。
dateRe := regexp.MustCompile(`(\d{4})-(\d{2})-(\d{2})`)
dateStr := "今日は2026-03-05です。"
match := dateRe.FindStringSubmatch(dateStr)
if match != nil {
fmt.Println("全体:", match[0])
fmt.Println("年:", match[1])
fmt.Println("月:", match[2])
fmt.Println("日:", match[3])
}
fmt.Println()
// 置換の例です。
emailRe := regexp.MustCompile(`[\w.+-]+@[\w-]+\.[a-z]{2,}`)
s := "連絡先: user@example.com または admin@wp-p.info まで"
masked := emailRe.ReplaceAllString(s, "[メール非公開]")
fmt.Println("マスク後:", masked)
// 関数を使った動的な置換です。
numRe := regexp.MustCompile(`\d+`)
doubled := numRe.ReplaceAllStringFunc("値は10と20です", func(m string) string {
// マッチした数字を文字列で受け取り、変換して返します。
return "(" + m + "の2倍)"
})
fmt.Println("置換後:", doubled)
fmt.Println()
// 分割の例です。
spaceRe := regexp.MustCompile(`\s+`)
words := spaceRe.Split("Hello World Go", -1)
fmt.Println("分割結果:", words)
}
概要
Goの正規表現はRE2構文を使います。Perl互換の正規表現(PCRE)とは一部異なり、後読み(lookbehind)や後方参照は使えません。これはRE2が線形時間で動作することを保証するための設計です。
正規表現リテラルはバッククォート文字列(`` ` ``)を使うとバックスラッシュのエスケープが不要になります。例えば『`\d+`』のように書けます。
regexp.MustCompile()はコンパイルエラー時にpanicします。パッケージレベルの変数として初期化するときに使い、ユーザー入力など動的なパターンにはregexp.Compile()を使ってください。
記事の間違いや著作権の侵害等ございましたらお手数ですがこちらまでご連絡頂ければ幸いです。