İçeriğe geç
Educora
İleri22 dk21 / 27

Düzenli ifadeler

Metni düzenli ifadelerle ara, doğrula ve dönüştür: karakter sınıfları, niceleyiciler, çapalar, gruplar, bayraklar ve `test`, `match`, `matchAll`, `replace` metotları.

Kendini test et
Bu derste öğreneceklerin
  • Karakter sınıfları, niceleyiciler ve çapalarla kalıpları okumak ve yazmak
  • g, i, m, u bayraklarını ve test, match, matchAll, replace, split metotlarını kullanmak
  • Yakalayan ve adlandırılmış gruplarla veri çıkarmak ve tipik tuzaklardan kaçınmak

Bir telefon numarasının +994 50 123 45 67 biçiminde olduğunu kontrol etmek, bir gönderideki tüm hashtag'leri bulmak, 2026-09-27 tarihini 27.09.2026'ya çevirmek: sıradan string metotlarıyla her iş onlarca satır tutar. Bir düzenli ifade (regular expression, regex) bir metin kalıbını tek satırda tanımlar. İlk başta şifreli görünür, ama küçük bir yapı taşı setinden oluşur; onları tanıyınca her şey okunur hâle gelir.

Regex oluşturmak ve ilk metotlar

Bir regex iki yolla oluşturulur: /kalıp/bayraklar literali ya da kalıp çalışma sırasında kuruluyorsa new RegExp('kalıp', 'bayraklar'). Ana metotlar: regex.test(str) true/false döndürür; str.match(regex) ilk eşleşmeyi (g ile hepsini) verir; str.replace(regex, yeni) değiştirir; str.split(regex) kalıba göre böler.

JavaScript
const text = 'Order 15 arrived. Order 27 is late. Call 555.';

console.log(/late/.test(text));
console.log(/LATE/i.test(text));
console.log(text.match(/\d+/)[0]);
console.log(text.match(/\d+/g));
console.log(text.replace(/Order/g, 'Parcel'));
console.log('a1b22c333'.split(/\d+/));
▸ Beklenen çıktı
true
true
15
[ '15', '27', '555' ]
Parcel 15 arrived. Parcel 27 is late. Call 555.
[ 'a', 'b', 'c', '' ]

Yapı taşları

KalıpAnlamı
.satır sonu dışında herhangi bir karakter
\d \w \srakam; kelime karakteri (Latin harf, rakam, _); boşluk karakteri. Büyük harf tersini belirtir: \D, \W, \S
[abc] [a-z] [^0-9]kümeden bir karakter; bir aralık; kümede olmayan bir karakter
* + ?0 ya da daha fazla; 1 ya da daha fazla; 0 ya da 1
{3} {2,5}tam 3 kez; 2'den 5'e kadar
^ $ \bstring'in başı; sonu; kelime sınırı
a|b ( ) (?<name> )ya da; grup; adlandırılmış grup
JavaScript
const patterns = {
  postcode: /^AZ\d{4}$/,
  phone: /^\+994 \d{2} \d{3} \d{2} \d{2}$/,
  username: /^[a-z][a-z0-9_]{2,15}$/,
};

const samples = {
  postcode: ['AZ1000', 'AZ100', 'az1000'],
  phone: ['+994 50 123 45 67', '+994501234567'],
  username: ['leyla_07', '7leyla', 'ab'],
};

for (const [name, regex] of Object.entries(patterns)) {
  const results = samples[name].map((value) => `${value}: ${regex.test(value)}`);
  console.log(`${name} -> ${results.join(', ')}`);
}
▸ Beklenen çıktı
postcode -> AZ1000: true, AZ100: false, az1000: false
phone -> +994 50 123 45 67: true, +994501234567: false
username -> leyla_07: true, 7leyla: false, ab: false
+ özel bir karakter olduğundan onu harfiyen aramak için \+ yazılır. Kullanıcı adı bir harfle başlamalı ve toplam 3–16 karakter olmalıdır.

Bayraklar

  • g — global: tüm eşleşmeler (matchAll ve regex ile replaceAll için gerekir);
  • i — büyük/küçük harf farkı gözetilmez;
  • m — çok satırlı: ^ ve $ her satırın başı ve sonudur;
  • s — . satır sonuyla da eşleşir;
  • u — Unicode: emojiler ve \p{L} (herhangi bir alfabenin harfi) doğru çalışır.
JavaScript
const words = 'Gəncə şəhəri';

console.log(words.match(/\w+/g));
console.log(words.match(/\p{L}+/gu));

const poem = 'first line\nsecond line\nthird line';
console.log(poem.match(/^\w+/gm));
▸ Beklenen çıktı
[ 'G', 'nc', 'h', 'ri' ]
[ 'Gəncə', 'şəhəri' ]
[ 'first', 'second', 'third' ]
\w yalnızca İngiliz alfabesinin harflerini tanır; bu yüzden onun dışındaki harfler kelimeleri böler. Azerbaycanca, Rusça ya da Türkçe metinler için u bayrağıyla \p{L} kullan.

Gruplar ve değiştirme

Parantezler eşleşmenin parçalarını yakalar. g olmadan match bir dizi döndürür: [tam eşleşme, grup1, grup2, ...]; adlandırılmış gruplar ise .groups içindedir. matchAll (g gerektirir) tüm eşleşmeleri gruplarıyla birlikte verir. replace içinde $1 ve $<ad> gruplara başvurur, değiştirici fonksiyon ise eşleşmeyi ve grupları argüman olarak alır.

JavaScript
const date = '2026-09-27';
const match = date.match(/^(?<year>\d{4})-(?<month>\d{2})-(?<day>\d{2})$/);

console.log(match[1], match.groups.month, match.groups.day);
console.log(date.replace(/(\d{4})-(\d{2})-(\d{2})/, '$3.$2.$1'));

const post = 'Learning #javascript and #regex at #Educora';
const tags = [...post.matchAll(/#(\w+)/g)].map((m) => m[1].toLowerCase());
console.log(tags);

const prices = 'tea 2 AZN, bread 1 AZN';
console.log(prices.replace(/(\d+) AZN/g, (whole, amount) => `${amount * 2} AZN`));
▸ Beklenen çıktı
2026 09 27
27.09.2026
[ 'javascript', 'regex', 'educora' ]
tea 4 AZN, bread 2 AZN
JavaScript
const html = '<b>bold</b> and <i>italic</i>';
console.log(html.match(/<.*>/)[0]);
console.log(html.match(/<.*?>/g));

const hasDigit = /\d/g;
console.log(hasDigit.test('a1'), hasDigit.test('a1'), hasDigit.test('a1'));

console.log('1.5'.match(/\d.\d/)[0], '1x5'.match(/\d.\d/)[0], /\d\.\d/.test('1x5'));
▸ Beklenen çıktı
<b>bold</b> and <i>italic</i>
[ '<b>', '</b>', '<i>', '</i>' ]
true false true
1.5 1x5 false
Alıştırma

isStrongPassword(password) fonksiyonunu yaz: parola en az 8 karakter olmalı, en az bir rakam ve bir büyük Latin harf içermeli. Her kural için ayrı bir regex ve test kullan.

Alıştırma · JavaScript
function isStrongPassword(password) {
  // 8+ characters, a digit, an uppercase letter
}

for (const password of ['secret', 'Secret123', 'secretpass1', 'SECRETPASS']) {
  console.log(`${password}: ${isStrongPassword(password)}`);
}
▸ Beklenen çıktı
secret: false
Secret123: true
secretpass1: false
SECRETPASS: false
Alıştırma

Metindeki tüm GG.AA.YYYY tarihlerini ISO biçimine, yani YYYY-AA-GG'ye çevir ve sonucu yazdır. Sonra metinde kaç tarih olduğunu Dates: N biçiminde yazdır.

Alıştırma · JavaScript
const text = 'Exams: 05.06.2026 and 12.06.2026. Holidays from 20.06.2026.';

// 1) replace every DD.MM.YYYY with YYYY-MM-DD and print the text
// 2) print Dates: N
▸ Beklenen çıktı
Exams: 2026-06-05 and 2026-06-12. Holidays from 2026-06-20.
Dates: 3

Önemli noktalar

  • Regex bir metin kalıbıdır: /kalıp/bayraklar ya da new RegExp(...).
  • Yapı taşları: sınıflar (\d, \w, [a-z]), niceleyiciler (+, *, ?, {n,m}), çapalar (^, $, \b), gruplar ve |.
  • Bayraklar: g tüm eşleşmeler, i büyük/küçük harf duyarsız, m çok satırlı, u Unicode (\p{L}).
  • test kontrol eder, match/matchAll çıkarır, replace ise $1, $<ad> ya da bir fonksiyonla dönüştürür.
  • Doğrulama kalıplarını çapala; açgözlü .*'a, g ve test ile lastIndex'e ve kaçışsız özel karakterlere dikkat et.

Kendini test et

10 soru. Her doğru cevap XP kazandırır.

1 / 10
/^\d{3}$/ hangi string'le eşleşir?