hakeの日記

Windows環境でプログラミングの勉強をしています。

Go言語 - 正規表現

日本語も一文字として認識してくれるみたい。
でも、文字の位置を返すメソッドはバイトスライスの位置なのでで注意。

package main

import (
	"fmt"
	"regexp"
)

func main() {

	s := "aあbいcうdえeおf"

	// 正規表現にマッチするかの有無
	fmt.Println(regexp.MatchString("あ.", s)) //-> true <nil>
	fmt.Println(regexp.MatchString("か.", s)) //-> false <nil>

	// 正規表現パターンのコンパイル
	re1 := regexp.MustCompile("..")
	re2 := regexp.MustCompile(".*")

	// マッチした文字列のスライスを返す
	fmt.Println(re1.FindAllString(s, -1)) //-> [aあ bい cう dえ eお]
	fmt.Println(re1.FindAllString(s,  2)) //-> [aあ bい]
	fmt.Println(re2.FindAllString(s, -1)) //-> [aあbいcうdえeおf]


	re3 := regexp.MustCompile(".(.)(.).")

	// [マッチした文字列, キャプチャ文字列1, ……]を要素とするスライスを返す
	fmt.Println(re3.FindAllStringSubmatch(s, -1)) //-> [[aあbい あ b] [cうdえ う d]]
	fmt.Println(re3.FindAllStringSubmatchIndex(s, -1)) //-> [[0 8 1 4 4 5] [8 16 9 12 12 13]]
	                                            //    マッチした要素のbyte列でのスライス値を表示

	// 最初にマッチした文字列
	fmt.Println(re1.FindString(s)) //-> [aあ]   // マッチしない場合は空文字列""を返す。

	// マッチした文字列を置換
	fmt.Println(re3.ReplaceAllLiteralString(s, "$1")) //-> $1$1eおf   $1は文字

	fmt.Println(re3.ReplaceAllString(s, "$1")) //-> あうeおf          $1は最初にキャプチャされた文字
	fmt.Println(re3.ReplaceAllString(s, "$2")) //-> bdeおf            $2は2番目にキャプチャされた文字

}