A.45. Regex

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 chapter ini kita akan belajar mengenai pengaplikasian regex dengan memanfaatkan fungsi-fungsi dalam package regexp.

A.45.1. Penerapan 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)
    // []string{"banana", "burger"}

    var res2 = regex.FindAllString(text, -1)
    fmt.Printf("%#v \n", res2)
    // []string{"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 slice 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.

A.45.2. Method MatchString()

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]+.

A.45.3. Method FindString()

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.

A.45.4. Method FindStringIndex()

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.

A.45.5. Method FindAllString()

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.

A.45.6. Method ReplaceAllString()

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"

A.45.7. Method ReplaceAllStringFunc()

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.

A.45.8. Method Split()

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 kriteria regex akan menjadi separator dalam operasi pemisahan/split. Contoh lain, jika di-isi 2, maka hanya 2 karakter pertama yang memenuhi kriteria regex akan menjadi separator dalam split tersebut.

var text = "banana burger soup"
var regex, _ = regexp.Compile(`[a-b]+`) // split dengan separator adalah karakter "a" dan/atau "b"

var str = regex.Split(text, -1)
fmt.Printf("%#v \n", str)
// []string{"", "n", "n", " ", "urger soup"}

Pada contoh di atas, ekspresi regexp [a-b]+ digunakan sebagai kriteria split. Maka karakter a dan/atau b akan menjadi separator.