JavaScript Regular Expressions: Kapsamlı Rehber

JavaScript Regular Expressions: Kapsamlı Rehber
Düzenli ifadeler (Regular Expressions / Regex), metin içinde kalıp eşleme ve metin dönüştürme için kullanılan güçlü bir araçtır. JavaScript'te regex, form doğrulama, metin arama/değiştirme, veri ayrıştırma ve URL routing gibi birçok senaryoda kullanılır. Bu rehberde regex sözdiziminden ileri düzey pattern'lere kadar her şeyi ele alıyoruz.
1. Regex Temelleri
JavaScript'te regex iki şekilde oluşturulur: literal sözdizimi (/pattern/flags) veya RegExp constructor'ı. Her birinin kullanım senaryoları farklıdır.
// Literal sözdizimi (statik kalıplar için)
const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
// Constructor (dinamik kalıplar için)
const aramaKelimesi = "JavaScript";
const dinamikRegex = new RegExp(aramaKelimesi, "gi");
// Temel metakarakterler
const ornekler = {
nokta: /a.b/, // a + herhangi bir karakter + b
baslangic: /^Merhaba/, // "Merhaba" ile başlayan
bitis: /dünya$/, // "dünya" ile biten
veya: /kedi|köpek/, // "kedi" veya "köpek"
};
// Karakter sınıfları
const siniflar = {
rakam: /\d/, // [0-9]
harf: /\w/, // [a-zA-Z0-9_]
bosluk: /\s/, // [ \t\n\r\f\v]
degil_rakam: /\D/, // [^0-9]
degil_harf: /\W/, // [^a-zA-Z0-9_]
};
// Niceleyiciler (Quantifiers)
const niceleyiciler = {
sifirVeyaDaha: /a*/, // 0 veya daha fazla 'a'
birVeyaDaha: /a+/, // 1 veya daha fazla 'a'
sifirVeyaBir: /a?/, // 0 veya 1 'a'
tamN: /a{3}/, // Tam 3 'a'
nVeyaDaha: /a{2,}/, // 2 veya daha fazla 'a'
nIleMArasinda: /a{2,5}/, // 2-5 arası 'a'
};
2. Regex Metotları ve Kullanımları
JavaScript'te regex ile çalışan hem RegExp hem String metotları vardır.
const metin = "JavaScript 2026 yılında çok popüler. ES2025 özellikleri harika.";
// test() — eşleşme var mı? (boolean)
const yilVar = /\d{4}/.test(metin);
console.log(yilVar); // true
// exec() — detaylı eşleşme bilgisi
const regex = /(\d{4})/g;
let eslesme;
while ((eslesme = regex.exec(metin)) !== null) {
console.log(`Yıl: ${eslesme[1]}, Index: ${eslesme.index}`);
}
// Yıl: 2026, Index: 11
// Yıl: 2025, Index: 41
// match() — tüm eşleşmeler
const tumYillar = metin.match(/\d{4}/g);
// ["2026", "2025"]
// matchAll() — detaylı iterasyon (ES2020)
for (const m of metin.matchAll(/ES(\d{4})/g)) {
console.log(`Versiyon: ${m[0]}, Yıl: ${m[1]}, Index: ${m.index}`);
}
// replace() ve replaceAll()
const gizlenmis = "Telefon: 0532-123-4567".replace(
/(\d{4})-(\d{3})-(\d{4})/,
"$1-***-****"
);
// "Telefon: 0532-***-****"
// search() — ilk eşleşme index'i
const pozisyon = metin.search(/\d{4}/);
// 11
// split() — regex ile bölme
const kelimeler = "merhaba;dünya,nasılsın hepsi".split(/[;,\s]+/);
// ["merhaba", "dünya", "nasılsın", "hepsi"]
g) ile exec() kullanırken, regex nesnesi lastIndex durumunu tutar. Aynı regex'i farklı string'lerde kullanmadan önce regex.lastIndex = 0 ile sıfırlayın veya her seferinde matchAll() tercih edin.
3. Gruplar ve Yakalama
Parantezli gruplar, eşleşen alt bölümleri yakalamak, geri referans kullanmak ve karmaşık kalıplar oluşturmak için kullanılır.
// Yakalama grupları
const tarihRegex = /(\d{2})\/(\d{2})\/(\d{4})/;
const [, gun, ay, yil] = "27/03/2026".match(tarihRegex);
console.log(`${yil}-${ay}-${gun}`); // "2026-03-27"
// Named groups (ES2018)
const namedRegex = /(?<gun>\d{2})\/(?<ay>\d{2})\/(?<yil>\d{4})/;
const { groups } = "27/03/2026".match(namedRegex);
console.log(groups.yil); // "2026"
// replace ile named groups
const isoTarih = "27/03/2026".replace(
/(?<g>\d{2})\/(?<a>\d{2})\/(?<y>\d{4})/,
"$-$-$"
);
// "2026-03-27"
// Non-capturing group (?:...)
const zamanRegex = /(?:AM|PM)\s+(\d{1,2}:\d{2})/;
// Geri referans (backreference)
const tekrarRegex = /(\w+)\s+\1/;
console.log(tekrarRegex.test("merhaba merhaba")); // true
console.log(tekrarRegex.test("merhaba dünya")); // false
// Lookahead ve Lookbehind
const sifre = "Parola123!";
const guclumu = /^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[!@#$%]).{8,}$/.test(sifre);
// Positive lookahead: en az 1 küçük, 1 büyük, 1 rakam, 1 özel karakter
// Lookbehind (ES2018)
const fiyatlar = "Fiyat: $100, €200, £300";
const dolarlar = fiyatlar.match(/(?<=\$)\d+/g); // ["100"]
const eurolar = fiyatlar.match(/(?<=€)\d+/g); // ["200"]
4. Pratik Regex Örnekleri
// Email doğrulama
const emailDogrula = /^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/;
// URL ayrıştırma
const urlRegex = /^(?<protokol>https?):\/\/(?<host>[^\/\s:]+)(?::(?<port>\d+))?(?<yol>\/[^\s?]*)?(?:\?(?<sorgu>[^\s#]*))?(?:#(?<fragment>\S*))?$/;
const url = "https://example.com:8080/api/users?page=1#section";
const { groups: urlParts } = url.match(urlRegex);
console.log(urlParts);
// { protokol: "https", host: "example.com", port: "8080", yol: "/api/users", ... }
// Türk telefon numarası
const telefonRegex = /^(\+90|0)?[\s-]?5\d{2}[\s-]?\d{3}[\s-]?\d{2}[\s-]?\d{2}$/;
console.log(telefonRegex.test("+90 532 123 45 67")); // true
// TC Kimlik (11 haneli, 0 ile başlamaz)
const tcRegex = /^[1-9]\d{10}$/;
// HTML tag temizleme
const htmlTemizle = (metin) => metin.replace(/<[^>]*>/g, "");
console.log(htmlTemizle("<p>Merhaba <b>dünya</b></p>"));
// "Merhaba dünya"
// Template literal değişken çıkarma
const sablon = "Merhaba {{ad}}, yaşınız {{yas}}";
const degerler = { ad: "Tarık", yas: 30 };
const sonuc = sablon.replace(/\{\{(\w+)\}\}/g, (_, anahtar) => degerler[anahtar] ?? "");
// "Merhaba Tarık, yaşınız 30"
DOMParser veya bir kütüphane kullanın. Regex yalnızca basit metin kalıpları için uygundur.
/v flag'i (unicodeSets), karakter sınıflarında küme işlemlerini (kesişim, fark) destekler: /[\p{Script=Greek}&&\p{Letter}]/v gibi ifadeler yazılabilir.
Sonuç
Regular expression'lar, metin işleme konusunda vazgeçilmez bir araçtır. Temel metakarakterler, niceleyiciler, karakter sınıfları, yakalama grupları, lookahead/lookbehind ve named groups ile karmaşık metin kalıplarını eşleştirebilir ve dönüştürebilirsiniz. Regex'i form doğrulama, veri ayrıştırma ve metin manipülasyonu gibi senaryolarda etkin şekilde kullanarak daha güçlü uygulamalar geliştirin.