Menyaring dan mengekstrak teks dengan regular expression: pola dasar dengan metacharacter dan quantifier, operator -match dan -replace, pencarian di file dengan Select-String, method statis dari kelas regex, pola umum email IP tanggal dan nomor telepon, serta praktik terbaik untuk regex yang cepat dan terbaca.

Di episode 10 kalian bekerja dengan data terstruktur: CSV, JSON, dan XML — semuanya sudah rapi. Tapi dunia nyata lebih berantakan: log server, output program lawas, dan input pengguna adalah teks bebas tanpa struktur. Untuk memfilter, memvalidasi, dan mengekstrak dari teks semacam itu, kalian butuh regular expressions — pola yang mengenali teks.
Bayangkan regex sebagai detektor logam: bukan mencari teks persis, melainkan pola — "cari semua yang mirip alamat IP", "temukan semua nomor invoice". Konsepnya kalian sudah singgung lewat operator -match di episode 4; episode 11 membahasnya secara menyeluruh.
Regex dibangun dari literal (teks persis) dan metacharacter (simbol dengan makna khusus):
| Simbol | Makna | Contoh |
|---|---|---|
. | Sembarang satu karakter | a.c cocok abc, axc |
* | Nol atau lebih dari sebelumnya | ab*c cocok ac, abc, abbc |
+ | Satu atau lebih dari sebelumnya | ab+c cocok abc, abbc |
? | Nol atau satu dari sebelumnya | colou?r cocok color, colour |
^ | Awal string | ^ERROR cocok string yang dimulai ERROR |
$ | Akhir string | done$ cocok string yang diakhiri done |
Di PowerShell, operator -match dan -replace memakai regex. Perhatikan pentingnya jangkar ^ dan $ — tanpa keduanya, -match "ERROR" juga cocok dengan "NOT_AN_ERROR" karena pola ditemukan di tengah:
"NOT_AN_ERROR" -match "ERROR"
"NOT_AN_ERROR" -match "^ERROR"
"abc" -match "a.c"
"axc" -match "a.c"Karakter class [...] mencocokkan satu karakter dari himpunan:
"a1" -match "^[a-z][0-9]$"
"Z9" -match "^[A-Z][0-9]$"
"abc" -match "^[a-c]+$"[a-z] rentang huruf kecil, [0-9] rentang angka, [A-Z] huruf besar. Kombinasi seperti [a-zA-Z0-9] mencakup huruf dan angka. Ada pula shorthand class yang sudah umum: \d angka, \w huruf-atau-angka-atau-garis-bawah, \s spasi.
"Tahun 2026" -match "\d{4}"Quantifier menentukan jumlah pengulangan:
| Quantifier | Makna |
|---|---|
* | 0 atau lebih |
+ | 1 atau lebih |
? | 0 atau 1 |
{n} | tepat n kali |
{n,} | n kali atau lebih |
{n,m} | antara n dan m kali |
"1234" -match "^\d{4}$"
"2026-08-03" -match "^\d{2,4}-\d{1,2}-\d{1,2}$"
"a" -match "^a{1,3}$"
"aaa" -match "^a{1,3}$"{n,m} membatasi rentang — tanggal 08-03 cocok dengan \d{1,2} karena satu atau dua digit sama-sama diterima.
Tiga operator utama pemakaian regex:
-match — mengembalikan benar atau salah dan mengisi $matches.-notmatch — kebalikannya.-replace — mengganti bagian yang cocok dengan teks baru."web-01" -replace "^web-", "app-"
"invoice-2026.pdf" -replace "\d{4}", "2027"
"2026-08-03" -replace "-", "/"-replace bisa memakai pola dan string pengganti yang menyertakan kelompok tangkap — misalnya menukar format tanggal:
"2026-08-03" -replace "^(\d{4})-(\d{2})-(\d{2})$", "$3/$2/$1"Saat -match berhasil, hasil bagian yang cocok tersimpan di variabel otomatis $matches — berupa kamus: seluruh kecocokan di kunci 0, setiap capture group (bagian dalam tanda kurung) di kunci 1, 2, dan seterusnya:
if ("server-42" -match "^(server)-(\d+)$") {
$matches[1]
$matches[2]
}Capture group membuat ekstraksi menjadi presisi: bukan sekadar "apakah cocok?", tapi "bagian mana yang cocok?" — pasangan $matches[1] dan $matches[2] adalah data yang bisa langsung dipakai.
Memberi nama pada group membuat kode lebih terbaca daripada mengingat nomor:
if ("web-01:8080" -match "^(?<host>[^:]+):(?<port>\d+)$") {
$matches.host
$matches.port
}Dengan sintaks (?<nama>...), kunci kamus diberi nama — $matches.host dan $matches.port terbaca seperti properti objek.
Select-String mencari teks di dalam file — mirip grep di terminal:
Select-String -Path /var/log/syslog -Pattern "ERROR"
Get-ChildItem /var/log -File | Select-String -Pattern "ERROR"Konfigurasi pencarian yang sering dipakai:
-Context — menampilkan baris sebelum dan sesudah kecocokan.-CaseSensitive — pencocokan peka huruf besar/kecil (default: tidak peka).Select-String -Path /var/log/syslog -Pattern "ERROR", "WARN" -Context 1, 2Output Select-String adalah objek MatchInfo dengan properti Line, LineNumber, Filename, dan Pattern — data yang siap diproses pipeline:
Select-String -Path /var/log/syslog -Pattern "ERROR" |
Select-Object Filename, LineNumber, LineUntuk kendali penuh, gunakan kelas .NET [regex] dengan method statisnya:
[regex]::Match("2026-08-03", "\d+").Value
[regex]::Matches("a1 b22 c333", "\d+") | ForEach-Object { $_.Value }
[regex]::Replace("2026-08-03", "-", "/")
[regex]::Split("a,b,c", ",")| Method | Fungsi |
|---|---|
Match | Kecocokan pertama, objek Match |
Matches | Semua kecocokan, koleksi yang bisa di-loop |
Replace | Ganti semua kecocokan |
Split | Pecah string berdasarkan pola |
[regex]::Matches mengembalikan koleksi — setiap elemen memiliki Value, Index, dan Groups. Berguna saat kalian butuh semua kecocokan sekaligus, bukan hanya yang pertama.
Pola-pola yang hampir pasti kalian butuh di script nyata:
$email = "^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$"
$ipv4 = "^((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)\.){3}(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)$"
$tanggal = "^(19|20)\d{2}-(0[1-9]|1[0-2])-(0[1-9]|[12]\d|3[01])$"
$hp = "^\+?62[0-9]{8,13}$"
"user@contoh.com" -match $email
"192.168.1.10" -match $ipv4
"2026-08-03" -match $tanggal
"+6281234567890" -match $hpPola IP di atas terlihat rumit, tapi logikanya tersusun: setiap oktet harus 0-255, dinyatakan lewat alternatif 25[0-5] (250-255) atau 2[0-4]\d (200-249) atau lainnya. Simpan pola seperti ini sebagai konstanta bernama di atas skrip — dengan nama, maksudnya jelas tanpa mengurai huruf demi huruf.
Warning
Validasi pola di production perlu ekstra hati-hati: pola email/IP di atas cukup untuk kebanyakan kasus, tapi tidak sempurna untuk setiap situasi. Contoh nyata: -match tidak peka huruf besar/kecil secara default dan tidak mewajibkan pencocokan penuh tanpa jangkar ^ dan $. Uji selalu di set data nyata sebelum diandalkan untuk memblokir input.
Kiat yang menyelamatkan kalian dari mimpi buruk regex:
^ dan $ bila ingin kecocokan penuh; tanpa itu, -match cocok di mana pun pola muncul.\. cocok titik, \* cocok bintang.* dan + serakah (mengambil sebanyak mungkin). Gunakan *? atau batasi dengan jangkar bila perlu.(?<nama>...) lebih jelas daripada mengingat nomor group.-like atau .Contains jauh lebih cepat.$pola = "^[a-z0-9_-]+$"
@("nama_valid", "NAMA SALAH!", "user-1") | ForEach-Object {
"$_ -> $($_ -match $pola)"
}Episode 11 melengkapi senjata penyaring teks: metacharacter dasar . * + ? ^ $; karakter class dan shorthand seperti \d; quantifier dengan rentang; operator -match, -notmatch, dan -replace; $matches beserta capture group dan named group; pencarian file dengan Select-String; method statis kelas [regex]; pola umum email, IP, tanggal, dan nomor telepon; serta praktik terbaik untuk regex yang cepat dan tidak menyakitkan.
Poin kunci yang dibawa pulang:
-match tidak mewajibkan kecocokan penuh — gunakan ^ dan $.$matches[1] mengambil capture group; (?<nama>...) memberinya nama.Select-String adalah grep-nya PowerShell dengan output objek.[regex]::Matches memberi semua kecocokan, bukan hanya yang pertama.Materi regular expressions menutup bagian fondasi: kondisi, loop, fungsi, pipeline, file, data terstruktur, dan pola teks — kalian kini bisa membaca dan menulis skrip yang nyata. Namun skrip yang nyata pasti menghadapi kegagalan. Di episode 12 kita belajar error handling — mengubah kegagalan dari musuh misterius menjadi kejadian yang terkendali. Sampai jumpa di episode 12!