İçeriğe geç
JavaScript

JavaScript Regular Expressions: Kapsamlı Rehber

Tarık Tunç
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"]
İpucu: Global flag (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"
Uyarı: Regex ile HTML ayrıştırmayın — karmaşık HTML yapıları regex ile doğru işlenemez. HTML için DOMParser veya bir kütüphane kullanın. Regex yalnızca basit metin kalıpları için uygundur.
Bilgi: ES2024 ile gelen /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.

Kaynaklar

İlgili Yazılar