Regexp
Cocokkan dan ekstrak pola teks dengan regexp.
Pahami konsepnya
Reguler expression mendeskripsikan pola teks: \d+ untuk deretan angka, [a-z]+ untuk huruf kecil, ^...$ untuk jangkar awal-akhir, dan tanda kurung (...) untuk menangkap bagian. Go memakai sintaks RE2 — cepat dan aman dari eksplosi waktu pencarian, dengan biaya kecil: tidak ada backreference.
Pola dikompilasi dulu lewat regexp.MustCompile(`...`) (panic saat pola salah — untuk konstanta saat program dimuat) atau regexp.Compile yang mengembalikan error (untuk pola dari input). Kompilasi sekali, pakai berkali-kali.
Operasi utama pada objek pola: MatchString memeriksa kecocokan, FindString mengembalikan kecocokan pertama, FindAllString semua kecocokan dengan batas -1, FindStringSubmatch mengembalikan grup penangkap (indeks 0 seluruh kecocokan, 1..n tiap kurung), dan ReplaceAllString mengganti dengan rujukan $1 ke grup.
Coba contoh kode
package main
import (
"fmt"
"regexp"
)
func main() {
pola := regexp.MustCompile(`\d+`)
fmt.Println(pola.MatchString("pesanan #40123")) // true
fmt.Println(pola.FindAllString("jam 08 dan 17 menit", -1))
}Pola \d+ berarti "satu atau lebih angka". MatchString menjawab ada-tidaknya; FindAllString mengumpulkan setiap kecocokan — pada teks itu ia menemukan "08" dan "17". Argumen -1 berarti tanpa batas jumlah hasil.
Menangkap grup pola
func main() {
pola := regexp.MustCompile(`(\w+)@(\w+)\.com`)
teks := "kontak: andi@kampus.com, budi@kantor.com"
for _, m := range pola.FindAllStringSubmatch(teks, -1) {
fmt.Printf("user=%s domain=%s\n", m[1], m[2])
}
}Tiap kurung menjadi grup penangkap: m[0] seluruh kecocokan (andi@kampus.com), m[1] bagian pertama (andi), m[2] kedua (kampus). FindAllStringSubmatch menjalankannya untuk semua kemunculan — cetakan dasar ekstraksi data dari teks semi-terstruktur.
Latihan singkat
Uji: perbaiki pola agar menemukan angka UTUH — program harus mencetak persis `[12 03 2007]`.