Regular Expressions

Regular Expressions #

// Go က [regular expressions](https://en.wikipedia.org/wiki/Regular_expression) အတွက် built-in ထောက်ပံ့မှုပေးထားပါတယ်။
// ဒီမှာ Go မှာ အသုံးများတဲ့ regexp-related လုပ်ငန်းတွေရဲ့ ဥပမာတချို့ ရှိပါတယ်။
package main

import (
	"bytes"
	"fmt"
	"regexp"
)

func main() {
	// ဒါက pattern တစ်ခုက string တစ်ခုနဲ့ ကိုက်ညီမှု ရှိမရှိ စမ်းသပ်ပါတယ်။
	match, _ := regexp.MatchString("p([a-z]+)ch", "peach")
	fmt.Println(match)

	// အပေါ်မှာ ကျွန်တော်တို့က string pattern ကို တိုက်ရိုက်သုံးခဲ့ပါတယ်၊ ဒါပေမယ့်
	// တခြား regexp လုပ်ငန်းတွေအတွက် သင့်အနေနဲ့ optimize လုပ်ထားတဲ့ `Regexp` struct တစ်ခုကို
	// `Compile` လုပ်ဖို့ လိုအပ်ပါလိမ့်မယ်။
	r, _ := regexp.Compile("p([a-z]+)ch")

	// ဒီ struct တွေမှာ method အများကြီး ရနိုင်ပါတယ်။ ဒါက
	// အရင်က ကျွန်တော်တို့ မြင်ခဲ့တဲ့လိုမျိုး match test တစ်ခုပါ။
	fmt.Println(r.MatchString("peach"))

	// ဒါက regexp နဲ့ကိုက်ညီတာကို ရှာဖွေပါတယ်။
	fmt.Println(r.FindString("peach punch"))

	// ဒါကလည်း ပထမဆုံး ကိုက်ညီတာကို ရှာပါတယ်၊ ဒါပေမယ့် ကိုက်ညီတဲ့
	// စာသားအစား ကိုက်ညီတဲ့နေရာရဲ့ အစနဲ့အဆုံး index တွေကို ပြန်ပေးပါတယ်။
	fmt.Println("idx:", r.FindStringIndex("peach punch"))

	// `Submatch` မျိုးကွဲတွေက pattern တစ်ခုလုံးနဲ့ကိုက်ညီမှုအကြောင်း သတင်းအချက်အလက်ရော
	// အဲဒီကိုက်ညီမှုထဲက submatch တွေအကြောင်း သတင်းအချက်အလက်ပါ ထည့်သွင်းပါတယ်။
	// ဥပမာ ဒါက `p([a-z]+)ch` နဲ့ `([a-z]+)` နှစ်ခုလုံးအတွက် သတင်းအချက်အလက် ပြန်ပေးပါလိမ့်မယ်။
	fmt.Println(r.FindStringSubmatch("peach punch"))

	// ဒီနည်းတူပဲ ဒါက ကိုက်ညီမှုတွေနဲ့ submatch တွေရဲ့ index တွေအကြောင်း သတင်းအချက်အလက် ပြန်ပေးပါလိမ့်မယ်။
	fmt.Println(r.FindStringSubmatchIndex("peach punch"))

	// ဒီ function တွေရဲ့ `All` မျိုးကွဲတွေက ပထမတစ်ခုတည်းမဟုတ်ဘဲ
	// input ထဲက ကိုက်ညီမှုအားလုံးကို အကျုံးဝင်ပါတယ်။ ဥပမာ
	// regexp နဲ့ကိုက်ညီတာအားလုံးကို ရှာဖို့ပါ။
	fmt.Println(r.FindAllString("peach punch pinch", -1))

	// ဒီ `All` မျိုးကွဲတွေက အပေါ်မှာ ကျွန်တော်တို့ မြင်ခဲ့တဲ့
	// တခြား function တွေအတွက်လည်း ရနိုင်ပါတယ်။
	fmt.Println("all:", r.FindAllStringSubmatchIndex(
		"peach punch pinch", -1))

	// ဒီ function တွေရဲ့ ဒုတိယ argument အနေနဲ့ အပေါင်းကိန်း integer တစ်ခု ပေးခြင်းအားဖြင့်
	// ကိုက်ညီမှုအရေအတွက်ကို ကန့်သတ်နိုင်ပါတယ်။
	fmt.Println(r.FindAllString("peach punch pinch", 2))

	// အပေါ်က ဥပမာတွေမှာ ကျွန်တော်တို့က string argument တွေ သုံးခဲ့ပြီး
	// `MatchString` လိုမျိုး နာမည်တွေ သုံးခဲ့ပါတယ်။ ကျွန်တော်တို့က
	// `[]byte` argument တွေကိုလည်း ပေးနိုင်ပြီး function နာမည်ကနေ `String` ကို ဖြုတ်နိုင်ပါတယ်။
	fmt.Println(r.Match([]byte("peach")))

	// Regular expression တွေနဲ့ global variable တွေ ဖန်တီးတဲ့အခါ
	// `Compile` ရဲ့ မျိုးကွဲဖြစ်တဲ့ `MustCompile` ကို သုံးနိုင်ပါတယ်။
	// `MustCompile` က error ပြန်မပေးဘဲ panic ဖြစ်စေပါတယ်၊ ဒါက global variable တွေအတွက်
	// ပိုပြီး လုံခြုံစိတ်ချရစေပါတယ်။
	r = regexp.MustCompile("p([a-z]+)ch")
	fmt.Println("regexp:", r)

	// `regexp` package ကို string တစ်ခုရဲ့ တစ်စိတ်တစ်ပိုင်းကို
	// တခြားတန်ဖိုးတွေနဲ့ အစားထိုးဖို့လည်း သုံးနိုင်ပါတယ်။
	fmt.Println(r.ReplaceAllString("a peach", "<fruit>"))

	// `Func` မျိုးကွဲက ကိုက်ညီတဲ့စာသားကို ပေးထားတဲ့ function တစ်ခုနဲ့
	// ပြောင်းလဲခွင့်ပေးပါတယ်။
	in := []byte("a peach")
	out := r.ReplaceAllFunc(in, bytes.ToUpper)
	fmt.Println(string(out))
}
$ go run regular-expressions.go
true
true
peach
idx: [0 5]
[peach ea]
[0 5 1 3]
[peach punch pinch]
all: [[0 5 1 3] [6 11 7 9] [12 17 13 15]]
[peach punch]
true
regexp: p([a-z]+)ch
a <fruit>
a PEACH

# For a complete reference on Go regular expressions check
# the [`regexp`](https://pkg.go.dev/regexp) package docs.