Use Cases (Diperbarui: 2/6/2026)

Membuat, Menguji, dan Mereview Regex dengan Claude Code

Panduan praktis regex dengan Claude Code: email, nomor telepon, log, named capture, test, dan jebakan umum.

Membuat, Menguji, dan Mereview Regex dengan Claude Code

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

JebakanInstruksi yang lebih baik
Hanya memberi contoh validSertakan minimal 3 contoh yang ditolak
Memakai .* di mana-manaPakai batas jelas seperti [^"]*
Memakai ulang regex dengan g di test()Pisahkan regex validasi dan regex pencarian
Bergantung pada indeks captureGunakan named capture atau non-capturing group
Menganggap regex sebagai validasi bisnisCek 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.

#Claude Code #regular expressions #regex #debugging #testing
Gratis

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.

Masa

Tentang penulis

Masa

Engineer yang berfokus pada workflow Claude Code praktis dan adopsi tim.