Regex atau regexp atau regular expression adalah suatu teknik yang digunakan untuk pencocokan string dengan pola tertentu. Regex biasa dimanfaatkan untuk pencarian dan pengubahan data string.
Go mengadopsi standar regex RE2, untuk melihat sintaks yang di-support engine ini bisa langsung merujuk ke dokumentasinya di https://github.com/google/re2/wiki/Syntax.
Pada bab ini kita akan belajar mengenai pengaplikasian regex dengan memanfaatkan fungsi-fungsi dalam package regexp
.
Fungsi regexp.Compile()
digunakan untuk mengkompilasi ekspresi regex. Fungsi tersebut mengembalikan objek bertipe regexp.*Regexp
.
Berikut merupakan contoh penerapan regex untuk pencarian karakter.
package main
import "fmt"
import "regexp"
func main() {
var text = "banana burger soup"
var regex, err = regexp.Compile(`[a-z]+`)
if err != nil {
fmt.Println(err.Error())
}
var res1 = regex.FindAllString(text, 2)
fmt.Printf("%#v \n", res1)
// ["banana", "burger"]
var res2 = regex.FindAllString(text, -1)
fmt.Printf("%#v \n", res2)
// ["banana", "burger", "soup"]
}
Ekspresi [a-z]+
maknanya adalah, semua string yang merupakan alphabet yang hurufnya kecil. Ekspresi tersebut di-compile oleh regexp.Compile()
lalu disimpan ke variabel objek regex
bertipe regexp.*Regexp
.
Struct regexp.Regexp
memiliki banyak method, salah satunya adalah FindAllString()
, berfungsi untuk mencari semua string yang sesuai dengan ekspresi regex, dengan kembalian berupa array string.
Jumlah hasil pencarian dari regex.FindAllString()
bisa ditentukan. Contohnya pada res1
, ditentukan maksimal 2
data saja pada nilai kembalian. Jika batas di set -1
, maka akan mengembalikan semua data.
Ada cukup banyak method struct regexp.*Regexp
yang bisa kita manfaatkan untuk keperluan pengelolaan string. Berikut merupakan pembahasan tiap method-nya.
Method ini digunakan untuk mendeteksi apakah string memenuhi sebuah pola regexp.
var text = "banana burger soup"
var regex, _ = regexp.Compile(`[a-z]+`)
var isMatch = regex.MatchString(text)
fmt.Println(isMatch)
// true
Pada contoh di atas isMatch
bernilai true
karena string "banana burger soup"
memenuhi pola regex [a-z]+
.
Digunakan untuk mencari string yang memenuhi kriteria regexp yang telah ditentukan.
var text = "banana burger soup"
var regex, _ = regexp.Compile(`[a-z]+`)
var str = regex.FindString(text)
fmt.Println(str)
// "banana"
Fungsi ini hanya mengembalikan 1 buah hasil saja. Jika ada banyak substring yang sesuai dengan ekspresi regexp, akan dikembalikan yang pertama saja.
Digunakan untuk mencari index string kembalian hasil dari operasi regexp.
var text = "banana burger soup"
var regex, _ = regexp.Compile(`[a-z]+`)
var idx = regex.FindStringIndex(text)
fmt.Println(idx)
// [0, 6]
var str = text[0:6]
fmt.Println(str)
// "banana"
Method ini sama dengan FindString()
hanya saja yang dikembalikan indeks-nya.
Digunakan untuk mencari banyak string yang memenuhi kriteria regexp yang telah ditentukan.
var text = "banana burger soup"
var regex, _ = regexp.Compile(`[a-z]+`)
var str1 = regex.FindAllString(text, -1)
fmt.Println(str1)
// ["banana", "burger", "soup"]
var str2 = regex.FindAllString(text, 1)
fmt.Println(str2)
// ["banana"]
Jumlah data yang dikembalikan bisa ditentukan. Jika diisi dengan -1
, maka akan mengembalikan semua data.
Berguna untuk me-replace semua string yang memenuhi kriteri regexp, dengan string lain.
var text = "banana burger soup"
var regex, _ = regexp.Compile(`[a-z]+`)
var str = regex.ReplaceAllString(text, "potato")
fmt.Println(str)
// "potato potato potato"
Digunakan untuk me-replace semua string yang memenuhi kriteri regexp, dengan kondisi yang bisa ditentukan untuk setiap substring yang akan di replace.
var text = "banana burger soup"
var regex, _ = regexp.Compile(`[a-z]+`)
var str = regex.ReplaceAllStringFunc(text, func(each string) string {
if each == "burger" {
return "potato"
}
return each
})
fmt.Println(str)
// "banana potato soup"
Pada contoh di atas, jika salah satu substring yang match adalah "burger"
maka akan diganti dengan "potato"
, string selainnya tidak di replace.
Digunakan untuk memisah string dengan pemisah adalah substring yang memenuhi kriteria regexp yang telah ditentukan.
Jumlah karakter yang akan di split bisa ditentukan dengan mengisi parameter kedua fungsi regex.Split()
. Jika di-isi -1
maka semua karakter yang memenuhi regex akan di-replace. Contoh lain, jika di-isi 2
, maka hanya 2 karakter pertama yang memenuhi regex akan di-replace.
var text = "banana,burger,soup"
var regex, _ = regexp.Compile(`[a-z]+`)
var str = regex.Split(text, -1)
fmt.Printf("%#v \n", str)
// ["", ",", ",", ""]