BelajarKoding Logobelajarkoding

Platform belajar web development Indonesia. Artikel, cheat sheets, roadmap, dan code challenges untuk developer Indonesia.

Navigasi

  • Artikel
  • Cheat Sheets
  • Roadmap
  • Challenges
  • Pricing
  • Search

Produk Lain

  • JagoHermes
  • KelasClaude
  • KilatKoding
  • BelajarVibeCoding
  • JualanKoding

Support

  • Privacy Policy
  • Terms of Service
  • Email

© 2026 BelajarKoding. All rights reserved.

Galih PratamaBagian dari ekosistem Galih Pratama
belajarkoding LogobyGalih Pratama
RoadmapArtikelCheat SheetsChallengesUpgrade
belajarkoding LogobyGalih Pratama
RoadmapArtikelCheat SheetsChallengesUpgrade
belajarkoding LogobyGalih Pratama
RoadmapArtikelCheat SheetsChallengesUpgrade

Daftar Isi

Dasar RegexMembuat RegexTest dan MatchCharacter ClassesPredefined ClassesCustom Character SetsAnchorsPosisi MatchingQuantifiersJumlah PengulanganGreedy vs LazyGroups dan BackreferencesCapturing GroupsNon-Capturing GroupsBackreferencesLookaroundLookahead dan LookbehindContoh Lookaround Real-worldFlagsAlternationCommon PatternsEmailURLPhone Number (Indonesia)IP AddressDateSlugHex ColorString Methods dengan RegexReplace dengan CallbackSplit dengan Capture GroupsRegex di Bahasa LainPythonGolangGlossary
RegexJavaScriptText Processing

Regular Expressions (Regex) Cheat Sheet

Referensi cepat regex. Character classes, anchors, quantifiers, groups, lookaround, flags, dan common patterns. Perfect buat developer yang sering parsing dan validasi teks.

JavaScript7 min read1.240 kata
Silakan login atau daftar untuk membaca cheat sheet ini.

Baca Cheat Sheet Lengkap

Login atau daftar akun gratis untuk membaca cheat sheet ini.

LoginDaftar Gratis
Share:

#Dasar Regex

#Membuat Regex

Dua cara bikin pattern regex di JavaScript.

javascript
// Literal notation (preferred untuk pattern statis)
const emailPattern = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
 
// Constructor (untuk pattern dinamis)
const searchTerm = "hello";
const dynamicPattern = new RegExp(searchTerm, "gi");

#Test dan Match

javascript
const text = "Halo, email aku adalah test@example.com";
 
// test() - return boolean
emailPattern.test(text); // true
 
// match() - return array match atau null
text.match(/\b\w+@














#Character Classes

#Predefined Classes

Tabel class yang paling sering dipake.

javascript
// \d - digit (0-9)
/\d+/.test("abc123");  // true
 
// \D - non-digit
/\D/.test("123");      // false
 
// \w - word character (a-z, A-Z, 0-9, _)















#Custom Character Sets

javascript
// [abc] - salah satu a, b, atau c
/[aeiou]/.test("hello"); // true
 
// [a-z] - range huruf kecil
/[a-z]/.test("ABC");    // false
 
// [A-Za-z0-9] - alphanumeric
/[A-Za-z0-9]+





#Anchors

#Posisi Matching

javascript
// ^ - awal string
/^Hello/.test("Hello World");  // true
/^World/.test("Hello World"); // false
 
// $ - akhir string
/











#Quantifiers

#Jumlah Pengulangan

javascript
// * - 0 atau lebih
/ab*c/.test("ac");      // true (b 0 kali)
/ab*c/.test("abbbc");   // true
 


















#Greedy vs Lazy

javascript
const html = '<div class="a">Hello</div><div class="b">World</div>';
 
// Greedy (default) - match sebanyak mungkin
html.match(/<div.*>/);
// '<div class="a">Hello</div><div class="b">World</div>'
 
// Lazy (?) - match sesedikit mungkin
html.match(/




#Groups dan Backreferences

#Capturing Groups

javascript
// (pattern) - capturing group
const date = "2024-06-21";
const match = date.match(/(\d{4})-(\d{2})-(\d{2})/);









#Non-Capturing Groups

javascript
// (?:pattern) - group tanpa capture
"abc123".match(/(?:abc)(\d+)/);
// match[1] = "123" (hanya yang di-capture)
 
// Berguna untuk alternation tanpa capture
const yes = "yes yesn't";
yes.match(/(?:yes|

#Backreferences

javascript
// \1, \2, dst - referensi ke group sebelumnya
// Match kata berulang
/\b(\w+)\s+\1\b/.test("hello hello"); // true
/\b(\w+)\s+\1\b/




#Lookaround

#Lookahead dan Lookbehind

javascript
// (?=pattern) - positive lookahead (setelah posisi ini, harus match)
/\d+(?=px)/.test("100px");   // true
/\d+(?=px)/.test("100em");   











#Contoh Lookaround Real-world

javascript
// Password: minimal 8 char, ada huruf besar, huruf kecil, dan angka
const passwordPattern = /^(?=.*[a-z])(?=.*[A-Z])(?=.*\d).{8,}$/;
passwordPattern.test(





#Flags

javascript
// g - global (match semua, bukan cuma pertama)
"aaa".match(/a/g);  // ["a", "a", "a"]
"aaa".match(/a/);   // ["a"]
 
// i - case insensitive


















#Alternation

javascript
// | = OR
/cat|dog|bird/.test("I have a dog"); // true
 
// Grouping dengan alternation
/(cat|dog)s?/.test("cats"); // true
 

#Common Patterns

#Email

javascript
// Sederhana
/^[^\s@]+@[^\s@]+\.[^\s@]+$/
 
// Lebih ketat (RFC 5322近似)
/^[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]

#URL

javascript
// HTTP/HTTPS URL
/^https?:\/\/(www\.)?[-a-zA-Z0-9@:%._\+~#=]{1,256}\.[a-zA-Z0-9()]{1,6}\b([-a-zA-Z0-9()@:%_\+.~#?&//=]*)$


#Phone Number (Indonesia)

javascript
// Format Indonesia: +62 atau 08
/^(\+62|62|0)8[1-9][0-9]{6,11}$/
 
// Match nomor di teks
/(\+62|62|0)8[1-9]\d{6,11}/g

#IP Address

javascript
// IPv4
/^((25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(25[0-5]|2[0-4]\d|[01]?\d\d?)$/


#Date

javascript
// YYYY-MM-DD
/^\d{4}-(0[1-9]|1[0-2])-(0[1-9]|[12]\d|3[01])$/
 
// DD/MM/YYYY
/^(0[1-9]|[12]\d|3[01]

#Slug

javascript
/^[a-z0-9]+(?:-[a-z0-9]+)*$/
// "hello-world-123" match
// "Hello World" tidak match

#Hex Color

javascript
/^#?([0-9a-fA-F]{3}|[0-9a-fA-F]{6})$/
// "#fff" match
// "#1a2b3c" match
// "#ggg" tidak match

#String Methods dengan Regex

#Replace dengan Callback

javascript
// Replace dengan function
"hello world".replace(/(\w+)/g, (match, word) => {
  return word.charAt(0).toUpperCase() + word.





#Split dengan Capture Groups

javascript
// Groups ikut masuk ke hasil split
"a,b,c".split(/(,)/);
// ["a", ",", "b", ",", "c"]

#Regex di Bahasa Lain

#Python

python
import re
 
# Search
re.search(r'\d+', 'abc123')  # <Match object>
 
# Find all
re.findall(r'\d+', 'a1b2c3')  # ['1', '2', '3']
 









#Golang

go
import "regexp"
 
re := regexp.MustCompile(`\d+`)
 
// Match
re.MatchString("abc123") // true
 
// Find
re.FindString("abc123def") // "123"
 




#Glossary

  • Pattern: Ekspresi regex yang ngejelasin format teks yang dicari.
  • Anchor: Penanda posisi (^ awal, $ akhir, \b word boundary) yang ngga match karakter, cuma posisi.
  • Quantifier: Nentuin berapa kali suatu pattern harus muncul (* + ? ).
  • Greedy: Default behavior regex yang match sebanyak mungkin. Tambah ? buat lazy.
  • Capturing Group: Pattern dalam tanda kurung yang hasil match-nya bisa diakses.
  • Lookahead/Lookbehind: Assertion yang ngecek pattern tanpa consume karakter.
  • Flag: Modifier yang ngubah cara regex match (g global, i case-insensitive, m multiline).
  • Backreference: Referensi ke capturing group sebelumnya (\1, \2, dst).
\w
+
\.
\w
+\b
/
g
);
// ["test@example.com"]
// matchAll() - iterator untuk semua matches dengan groups
const matches = [...text.matchAll(/(\w+)@(\w+)\.(\w+)/g)];
// matches[0][1] = "test", matches[0][2] = "example", matches[0][3] = "com"
// search() - return index pertama match
text.search(/email/); // 6
// replace() - ganti match
text.replace(/test@/, "admin@");
// "Halo, email aku adalah admin@example.com"
// split() - pisah string berdasarkan pattern
"a,b;c.d".split(/[,;.]/); // ["a", "b", "c", "d"]
/\w+/.test("hello_123"); // true
// \W - non-word character
/\W/.test("hello!"); // true (match "!")
// \s - whitespace (space, tab, newline)
/\s/.test("hello world"); // true
// \S - non-whitespace
/\S/.test(" "); // false
// . - any character (kecuali newline)
/a.b/.test("axb"); // true
// Escape special chars: . * + ? ^ $ { } [ ] \ | ( )
/\$\d+\.\d+/.test("$19.99"); // true
/
.
test
(
"abc123"
);
// true
// [^abc] - negation, BUKAN a, b, atau c
/[^aeiou]/.test("a"); // false
// [0-9a-fA-F] - hexadecimal
/^[0-9a-fA-F]+$/.test("deadBEEF"); // true
World
$
/
.
test
(
"Hello World"
);
// true
// \b - word boundary
/\bcat\b/.test("the cat sat"); // true
/\bcat\b/.test("category"); // false
/\bcat/.test("catch"); // true (cat di awal kata)
// \B - non-word boundary
/\Bcat/.test("concatenate"); // true (cat di tengah kata)
// ^ dan $ bersamaan = full string match
/^\d{4}$/.test("2024"); // true
/^\d{4}$/.test("20241"); // false
// + - 1 atau lebih
/ab+c/.test("ac"); // false
/ab+c/.test("abc"); // true
// ? - 0 atau 1 (opsional)
/colou?r/.test("color"); // true
/colou?r/.test("colour"); // true
// {n} - tepat n kali
/\d{4}/.test("1234"); // true
/\d{4}/.test("123"); // false
// {n,} - minimal n kali
/\d{2,}/.test("12345"); // true
// {n,m} - antara n dan m kali
/\d{2,4}/.test("123"); // true
/\d{2,4}/.test("1"); // false
/\d{2,4}/.test("12345"); // false (lebih dari 4)
<div
.
*?
>
/
);
// '<div class="a">'
// Contoh lain
"aaa".match(/a+/); // ["aaa"] greedy
"aaa".match(/a+?/); // ["a"] lazy
// match[0] = "2024-06-21"
// match[1] = "2024" (year)
// match[2] = "06" (month)
// match[3] = "21" (day)
// Named groups (?<name>pattern)
const namedMatch = date.match(/(?<year>\d{4})-(?<month>\d{2})-(?<day>\d{2})/);
namedMatch.groups.year; // "2024"
namedMatch.groups.month; // "06"
namedMatch.groups.day; // "21"
no)n
?
/
g
);
// ["yes", "yesn't"] - wait, n't is separate
.
test
(
"hello world"
);
// false
// Match tanda kutip yang konsisten
/(['"])(.*?)\1/.test('"hello"'); // true
/(['"])(.*?)\1/.test("'hello'"); // true
/(['"])(.*?)\1/.test('"hello\''); // false (beda quote)
// false
// (?!pattern) - negative lookahead (setelah ini, TIDAK boleh match)
/\d+(?!px)/.test("100em"); // true
/\d+(?!px)/.test("100px"); // false
// (?<=pattern) - positive lookbehind (sebelum posisi ini, harus match)
/(?<=\$)\d+/.exec("$100"); // ["100"]
/(?<=\$)\d+/.exec("100"); // null
// (?<!pattern) - negative lookbehind (sebelum ini, TIDAK boleh match)
/(?<!\$)\b\d+\b/.exec("$100"); // null (ada $ sebelum angka)
/(?<!\$)\b\d+\b/.exec("100"); // ["100"]
"Password1"
);
// true
passwordPattern.test("password"); // false
// Angka dengan thousand separator (kecuali 4 digit di awal)
/\B(?=(\d{3})+(?!\d))/g;
"1234567".replace(/\B(?=(\d{3})+(?!\d))/g, ".");
// "1.234.567"
"Hello".match(/hello/i); // ["Hello"]
// m - multiline (^ dan $ match per line)
"a\nb".match(/^b/m); // ["b"]
"a\nb".match(/^b/); // null
// s - dotall (. match newline juga)
"a\nb".match(/a.b/s); // ["a\nb"]
"a\nb".match(/a.b/); // null (tanpa s, . ngga match \n)
// y - sticky (match mulai dari lastIndex)
const sticky = /abc/y;
sticky.lastIndex = 0;
sticky.test("abcabc"); // true
sticky.lastIndex = 3;
sticky.test("abcabc"); // true
// u - unicode
/^\u{1F600}$/.test("😀"); // true (unicode mode)
// Di dalam character class, | artinya literal pipe
/[|]/.test("a|b"); // true
{0,61}
[a-zA-Z0-9]
)
?
(?:
\.
[a-zA-Z0-9]
(?:
[a-zA-Z0-9-]
{0,61}
[a-zA-Z0-9]
)
?
)
*$
/
/
// Extract URLs dari teks
const urlRegex = /https?:\/\/[^\s]+/g;
// IPv6 (simplified)
/^([0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}$/
)
\/
(0
[1-9]
|
1
[0-2]
)
\/
\d
{4}$
/
slice
(
1
);
});
// "Hello World"
// Swap nama
"Doe, John".replace(/(\w+),\s*(\w+)/, "$2 $1");
// "John Doe"
# Substitute
re.sub(r'\d+', 'N', 'a1b2c3') # 'aNbNcN'
# Split
re.split(r'[,;]', 'a,b;c') # ['a', 'b', 'c']
# Named groups
m = re.search(r'(?P<year>\d{4})-(?P<month>\d{2})', '2024-06')
m.group('year') # '2024'
m.group('month') # '06'
// Find all
re.FindAllString("a1b2c3", -1) // ["1", "2", "3"]
// Replace
re.ReplaceAllString("a1b2", "N") // "aNbN"