Membuat, Menguji, dan Mereview Regex dengan Claude Code
Panduan praktis regex dengan Claude Code: email, nomor telepon, log, named capture, test, dan jebakan umum.
Regular expression atau regex sering bermasalah bukan karena simbolnya sulit, tetapi karena kebutuhannya belum jelas. Pola yang menerima user@example.com bisa saja menolak user+tag@sub.example.co.jp, menerima user@.com, atau menjadi sulit direview setelah ada capture group baru.
Claude Code paling berguna jika dipakai untuk membuat alur yang bisa diverifikasi: contoh yang boleh lolos, contoh yang harus ditolak, regex, test yang bisa dijalankan, dan checklist review. Regex adalah bahasa kecil untuk menjelaskan bentuk teks. Named capture adalah cara memberi nama pada bagian yang diekstrak, misalnya timestamp atau requestId.
Jika baru mulai, baca dulu panduan mulai Claude Code. Untuk menulis instruksi yang lebih stabil, lihat juga 5 tips prompt yang lebih baik. Referensi resmi yang perlu dibuka adalah Claude Code overview dan MDN Regular expressions.
Alur Kerja
flowchart LR
A["Contoh yang lolos"] --> C["Minta ke Claude Code"]
B["Contoh yang ditolak"] --> C
C --> D["Regex dan helper"]
D --> E["Test Node.js"]
E --> F["Review risiko"]
Jangan hanya meminta “buat regex email”. Jelaskan apakah tujuannya validasi, ekstraksi, penggantian teks, atau analisis log. Contoh yang kamu berikan akan menjadi kontrak yang dijaga oleh test.
Prompt Pertama
Buat helper regex JavaScript untuk alamat email, nomor telepon Jepang, dan log aplikasi.
Syarat:
- Bisa dijalankan langsung di Node.js
- Izinkan user+tag@sub.example.co.jp
- Tolak user..name@example.com dan user@.com
- Izinkan 090-1234-5678, 03-1234-5678, dan 05012345678
- Ambil timestamp, level, service, requestId, dan message dari log dengan named capture
- Tambahkan test dengan node:test
- Jelaskan bagian yang tidak seharusnya digantikan oleh regex
Hal terpenting adalah scope. Validasi email lengkap berdasarkan semua aturan RFC biasanya terlalu berat untuk form pendaftaran. Di sini kita memakai pola praktis untuk menolak kesalahan yang jelas, lalu menyerahkan keterkiriman email ke confirmation email atau backend.
Contoh 1: Helper Email, Telepon, dan Log
Simpan sebagai regex-helper.mjs, lalu jalankan node regex-helper.mjs.
import { fileURLToPath } from "node:url";
export const emailRegex =
/^(?!.*\.\.)[A-Z0-9_%+-]+(?:\.[A-Z0-9_%+-]+)*@(?:[A-Z0-9](?:[A-Z0-9-]{0,61}[A-Z0-9])?\.)+[A-Z]{2,63}$/i;
export const emailSearchRegex =
/[A-Z0-9_%+-]+(?:\.[A-Z0-9_%+-]+)*@(?:[A-Z0-9](?:[A-Z0-9-]{0,61}[A-Z0-9])?\.)+[A-Z]{2,63}/gi;
export const normalizedJapanesePhoneRegex = /^0(?:[5789]0\d{8}|[1-9]\d{8,9})$/;
export const looseJapanesePhoneSearchRegex =
/0\d{1,4}[-\s]?\d{1,4}[-\s]?\d{3,4}/g;
export const appLogRegex =
/^\[(?<timestamp>\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(?:\.\d{3})?Z)\]\s+(?<level>INFO|WARN|ERROR)\s+(?<service>[a-z][a-z0-9-]*)\s+requestId=(?<requestId>[A-Za-z0-9_-]+)\s+message="(?<message>[^"]*)"$/;
export function isEmail(input) {
return emailRegex.test(input.trim());
}
export function normalizePhone(input) {
return input.replace(/[()\s-]/g, "");
}
export function isJapanesePhone(input) {
return normalizedJapanesePhoneRegex.test(normalizePhone(input));
}
export function extractContacts(text) {
const emails = [...text.matchAll(emailSearchRegex)]
.map((match) => match[0])
.filter(isEmail);
const phones = (text.match(looseJapanesePhoneSearchRegex) ?? []).filter(
isJapanesePhone,
);
return {
emails: [...new Set(emails)],
phones: [...new Set(phones)],
};
}
export function parseLogLine(line) {
const match = line.match(appLogRegex);
if (!match?.groups) return null;
return {
timestamp: match.groups.timestamp,
level: match.groups.level,
service: match.groups.service,
requestId: match.groups.requestId,
message: match.groups.message,
};
}
if (process.argv[1] === fileURLToPath(import.meta.url)) {
const text = "Contact: user+tag@sub.example.co.jp / 090-1234-5678";
const log =
'[2026-06-02T10:15:30.000Z] ERROR billing-api requestId=req_123 message="payment failed"';
console.log(extractContacts(text));
console.log(parseLogLine(log));
}
Nomor telepon dinormalisasi sebelum divalidasi. Dengan menghapus tanda hubung dan spasi, regex tetap pendek dan format input tidak mudah mengubah hasil. Pada log, named capture membuat review lebih jelas karena match.groups.requestId lebih mudah dibaca daripada match[4].
Contoh 2: Test untuk Mengunci Perilaku
Simpan sebagai regex-helper.test.mjs, lalu jalankan node --test regex-helper.test.mjs.
import test from "node:test";
import assert from "node:assert/strict";
import {
extractContacts,
isEmail,
isJapanesePhone,
parseLogLine,
} from "./regex-helper.mjs";
test("validates practical email addresses", () => {
assert.equal(isEmail("user@example.com"), true);
assert.equal(isEmail("user+tag@sub.example.co.jp"), true);
assert.equal(isEmail("user..name@example.com"), false);
assert.equal(isEmail("user@.com"), false);
assert.equal(isEmail("@example.com"), false);
});
test("validates Japanese phone numbers after normalization", () => {
assert.equal(isJapanesePhone("090-1234-5678"), true);
assert.equal(isJapanesePhone("03-1234-5678"), true);
assert.equal(isJapanesePhone("05012345678"), true);
assert.equal(isJapanesePhone("123-4567-8901"), false);
assert.equal(isJapanesePhone("090-123-456"), false);
});
test("extracts contacts from free text", () => {
assert.deepEqual(
extractContacts("support: user+tag@example.com, tel: 090-1234-5678"),
{
emails: ["user+tag@example.com"],
phones: ["090-1234-5678"],
},
);
});
test("parses application logs with named captures", () => {
const parsed = parseLogLine(
'[2026-06-02T10:15:30.000Z] WARN auth-service requestId=req_abc message="retry required"',
);
assert.deepEqual(parsed, {
timestamp: "2026-06-02T10:15:30.000Z",
level: "WARN",
service: "auth-service",
requestId: "req_abc",
message: "retry required",
});
});
Minta Claude Code menjalankan test, bukan hanya menulisnya.
Jalankan node --test regex-helper.test.mjs.
Jika ada test gagal, jelaskan dulu apakah regex atau data test yang salah.
Saat memperluas dukungan email, tambahkan contoh yang lolos dan contoh yang ditolak terlebih dahulu.
Contoh 3: Prompt Ekstraksi Log
Log cocok untuk regex karena formatnya dikontrol aplikasi.
Baca logs/app.log, ambil hanya baris ERROR, lalu tulis requestId dan message ke CSV.
Gunakan appLogRegex yang sama dengan regex-helper.mjs.
Jangan membuang baris yang tidak bisa diparse secara diam-diam; tampilkan jumlahnya di akhir.
Jangan menulis alamat email atau nomor telepon ke CSV.
Di produksi, log lama, baris terpotong, dan output debug sementara sering muncul. Parser yang mengembalikan null lebih mudah direview daripada script yang mengabaikan data.
Template Review
## Regex review request
Files:
- regex-helper.mjs
- regex-helper.test.mjs
Review:
- Are allowed and rejected examples covered by tests?
- Are email, phone, and log responsibilities separated?
- Are named capture names readable?
- Is there any ambiguous repetition that could cause ReDoS?
- Could personal data leak into logs or CSV output?
Output:
- For each issue, include file, line, reason, and suggested fix
- Ask a question instead of guessing when the business rule is unclear
- Run node --test regex-helper.test.mjs after changes
ReDoS adalah kondisi ketika regex bisa memakan waktu sangat lama pada input tertentu. Jika ada pengulangan bertingkat, minta Claude Code mengecek risiko ini secara eksplisit.
Jebakan Umum
| Jebakan | Instruksi yang lebih baik |
|---|---|
| Hanya memberi contoh valid | Sertakan minimal 3 contoh yang ditolak |
Memakai .* di mana-mana | Pakai batas jelas seperti [^"]* |
Memakai ulang regex dengan g di test() | Pisahkan regex validasi dan regex pencarian |
| Bergantung pada indeks capture | Gunakan named capture atau non-capturing group |
| Menganggap regex sebagai validasi bisnis | Cek keterkiriman dan keberadaan di backend |
Regex bagus untuk merapikan bentuk input dan mengekstrak data dari teks yang terkontrol. Regex tidak membuktikan email bisa menerima pesan atau nomor telepon masih aktif.
CTA
Perbaikan regex sering dekat dengan jalur pendapatan: form lead, log pembayaran, dukungan pelanggan, dan signup unduhan. Untuk latihan, mulai dari cheatsheet Claude Code gratis. Untuk prompt dan template yang bisa dipakai ulang, lihat products. Untuk tim yang perlu merapikan validasi, review log, dan review gate, gunakan Claude Code training and consultation.
Ringkasan
Cara paling aman memakai Claude Code untuk regex adalah memberikan contoh, kontra-contoh, test, dan kriteria review dalam satu siklus. Dalam percobaan Masa, meminta “regex dan test sekaligus” lebih stabil daripada meminta regex saja, terutama untuk kasus user+tag, nomor telepon dengan tanda hubung, dan named capture pada log.
PDF gratis: cheatsheet Claude Code
Masukkan email dan unduh satu halaman berisi command, kebiasaan review, dan workflow aman.
Kami menjaga datamu dan tidak mengirim spam.
Tentang penulis
Masa
Engineer yang berfokus pada workflow Claude Code praktis dan adopsi tim.
Artikel terkait
Workflow Obsidian ke CLAUDE.md untuk Claude Code
Ubah catatan kerja Obsidian menjadi operating note CLAUDE.md agar konteks tidak dijelaskan ulang.
Claude Code Revenue CTA Routing: dari artikel ke PDF, Gumroad, dan konsultasi
Workflow Claude Code untuk mengarahkan pembaca ke PDF gratis, Gumroad, atau konsultasi sesuai intent.
Aturan handoff tim Claude Code: bukti review, permission, rollback, dan jalur revenue
Format handoff Claude Code untuk tim: bukti, permission rule, rollback, PDF gratis, Gumroad, dan konsultasi.