A.45. Regexp

Regexp atau regex atau regular expression adalah suatu teknik yang digunakan untuk pencocokan string yang memiliki pola tertentu. Regex biasa dimanfaatkan untuk pencarian dan pengubahan data string.

Go mengadopsi spesifikasi regex RE2. Lebih detailnya mengenai RE2 bisa langsung cek 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 semua hasil yang cocok dikembalikan oleh fungsi tersebut.

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 ada substring yang match dengan kata "burger", maka akan diganti dengan "potato".

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.