← Kembali ke kursus
Pelajaran kursus · Go
Pelajaran 40

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