3 Eylül 2016 Cumartesi

Javascript'de Regexp Nesnesi

Merhaba Webkolog Takipçileri!

Bugün JavaScript'te metin işleme yeteneklerimizin süper gücü olan Düzenli İfadeler (Regular Expressions) ve bunları temsil eden RegExp Nesnesi hakkında konuşacağız. Düzenli ifadeler, karmaşık metin arama, değiştirme ve doğrulama işlemleri yapmak için kullanılan güçlü kalıp eşleştirme araçlarıdır. Bir metin içindeki belirli bir deseni bulmaktan, e-posta adreslerinin geçerliliğini kontrol etmeye, URL'leri ayrıştırmaktan, metinleri dönüştürmeye kadar her alanda düzenli ifadeler bize eşsiz bir esneklik sunar. Hazırsanız, metinlerin içinde gizlenen desenleri ortaya çıkarmaya başlayalım!


Düzenli İfadeler (RegExp) Nedir ve Neden Önemlidir?

Düzenli İfade (Regular Expression), bir arama modelini tanımlayan özel bir karakter dizisidir. Bu desenler, string'ler içindeki karakter kombinasyonlarını bulmak için kullanılır. JavaScript'te bu desenler RegExp nesnesi tarafından temsil edilir.

RegExp, aşağıdaki gibi durumlar için vazgeçilmez bir araçtır:

  • Bir string'in belirli bir formata (örneğin, bir telefon numarası veya e-posta adresi) uyup uymadığını doğrulama.
  • Büyük metin blokları içinde belirli kelimeleri veya desenleri arama.
  • Bir metin içindeki bir veya daha fazla eşleşmeyi başka bir metinle değiştirme.
  • Karmaşık string'leri belirli desenlere göre parçalara ayırma.

RegExp Nesnesi Oluşturma Yöntemleri

RegExp nesnesini oluşturmanın iki temel yolu vardır:

1. Düzenli İfade Literali (Tavsiye Edilen)

Eğik çizgiler (/ /) arasına deseni yazarak oluşturulur. Bu yöntem daha basit ve okunabilir olduğu için genellikle tercih edilir.


    const ifade = /deneme/; // "deneme" kelimesini arar
    const globalIfade = /a/g; // Tüm 'a' harflerini arar (g = global)
    const duyarsizIfade = /ali/i; // "ali" kelimesini büyük/küçük harf duyarlılığı olmadan arar (i = ignoreCase)
2. new RegExp() Yapıcı Fonksiyonu

String'leri kullanarak dinamik olarak düzenli ifadeler oluşturmanız gerektiğinde bu yöntem kullanılır. Özellikle desenin veya bayrakların (flags) çalışma zamanında belirlendiği durumlarda faydalıdır.


    const arananKelime = "Webkolog";
    const ifade = new RegExp(arananKelime); // "Webkolog" kelimesini arar

    const desenString = "[aeiou]";
    const bayraklar = "g";
    const sesliHarflerIfadesi = new RegExp(desenString, bayraklar); // Tüm sesli harfleri arar

Düzenli İfade Bayrakları (Flags)

Desen aramasını nasıl yapacağınızı belirten isteğe bağlı ayarlar (harfleri) şunlardır:

  • g (global): Desenin tüm eşleşmelerini bulur, sadece ilkini değil.
  • i (ignore case): Eşleşmelerde büyük/küçük harf duyarlılığını yok sayar.
  • m (multiline): Çok satırlı metinlerde satır başı (^) ve satır sonu ($) karakterlerinin her satırın başında ve sonunda eşleşmesini sağlar.
  • u (unicode): Unicode desteği sağlar (ES6+).
  • y (sticky): Sadece son eşleşmenin lastIndex özelliğinden itibaren eşleşir (ES6+).

    const metin = "Merhaba dünya, Merhaba JavaScript.";
    const ifadeTek = /Merhaba/;
    const ifadeTum = /Merhaba/g;

    console.log(metin.match(ifadeTek)); // ["Merhaba", index: 0, ...] (sadece ilkini bulur)
    console.log(metin.match(ifadeTum)); // ["Merhaba", "Merhaba"] (tümünü bulur)

Temel Düzenli İfade Karakterleri ve Yapıları

Düzenli ifadeler, desenleri oluşturmak için birçok özel karaktere ve yapıya sahiptir.

1. Özel Karakterler (Metakarakterler)

Belirli karakter gruplarını veya konumları temsil ederler.

  • . (nokta): Yeni satır karakteri (\n) hariç herhangi bir karakterle eşleşir.
  • \d: Herhangi bir rakamla (0-9) eşleşir. (digit)
  • \D: Rakam olmayan herhangi bir karakterle eşleşir. (non-digit)
  • \w: Herhangi bir harf (a-z, A-Z), rakam (0-9) veya alt çizgi (_) ile eşleşir. (word character)
  • \W: Harf, rakam veya alt çizgi olmayan herhangi bir karakterle eşleşir. (non-word character)
  • \s: Herhangi bir boşluk karakteriyle (boşluk, tab, yeni satır vb.) eşleşir. (whitespace)
  • \S: Boşluk karakteri olmayan herhangi bir karakterle eşleşir. (non-whitespace)
  • \b: Kelime sınırı (word boundary) ile eşleşir. Bir harf, rakam veya alt çizgi ile kelime olmayan bir karakter arasındaki konumu temsil eder.
    
                const metin = "Bu bir Ali Mantar metni. Ali!";
                const ifade = /\bAli/g; // Kelime başında 'Ali'
                console.log(metin.match(ifade)); // ["Ali", "Ali"] (hem "Ali Mantar"daki Ali, hem de "Ali!"deki Ali)
            
  • \B: Kelime sınırı olmayan bir konumla eşleşir.
    
                const metin = "Bu bir Alinin kelimesi.";
                const ifade = /\Bli/g; // Kelime sınırı olmayan 'li' (yani kelime ortasında veya sonunda)
                console.log(metin.match(ifade)); // ["li"] (Alinin kelimesindeki 'li')
            
  • ^: Satırın başıyla eşleşir. (m bayrağı ile her satırın başı)
  • $: Satırın sonuyla eşleşir. (m bayrağı ile her satırın sonu)
2. Karakter Sınıfları (Sets)

Köşeli parantezler ([]) içine yazılan karakterler, o konumda o karakterlerden herhangi biriyle eşleşmeyi sağlar.

  • [abc]: 'a', 'b' veya 'c' karakterlerinden herhangi biriyle eşleşir.
  • [a-z]: 'a' ile 'z' arasındaki herhangi bir küçük harfle eşleşir.
  • [0-9]: 0 ile 9 arasındaki herhangi bir rakamla eşleşir (\d ile aynı).
  • [^abc]: 'a', 'b' veya 'c' dışındaki herhangi bir karakterle eşleşir. (^ burada "değil" anlamına gelir)
  • [^a-z]: 'a' ile 'z' arasındaki küçük harfler dışındaki herhangi bir karakterle eşleşir.
  • 
            const metin = "Bu bir / deneme metni.";
            const ifade = /[/\!]/g; // "/" veya "!" karakterleriyle eşleşir
            console.log(metin.match(ifade)); // ["/", "!"]
        
3. Tekrarlama Karakterleri (Quantifiers)

Bir karakterin veya grubun kaç kez tekrarlanabileceğini belirtir.

  • *: Kendinden önceki karakterin 0 veya daha fazla tekrarı.
  • +: Kendinden önceki karakterin 1 veya daha fazla tekrarı.
  • ?: Kendinden önceki karakterin 0 veya 1 tekrarı (isteğe bağlı).
  • {n}: Kendinden önceki karakterin tam olarak n kez tekrarı.
  • {n,}: Kendinden önceki karakterin en az n kez tekrarı.
  • {n,m}: Kendinden önceki karakterin en az n ve en fazla m kez tekrarı.
  • 
            console.log("aaaaa".match(/a+/));    // ["aaaaa"] (1 veya daha fazla 'a')
            console.log("colou?r".match(/colou?r/)); // "color" ve "colour" ile eşleşir
            console.log("111-222-333".match(/\d{3}/g)); // ["111", "222", "333"] (3 rakamlık gruplar)
        
4. Gruplama ve Yakalama (Capturing Groups)

Parantezler (()) desenin bir kısmını gruplamak ve bu kısmı yakalamak için kullanılır.

  • (desen): Deseni gruplar ve eşleşen kısmı yakalar.
  • (?:desen): Deseni gruplar ama eşleşen kısmı yakalamaz (non-capturing group).
  • \n: n. yakalanan grubun içeriğini tekrar kullanır (geri referans).
5. Mantıksal VEYA (OR)
  • x|y: x veya y ile eşleşir.
    
                console.log("elma armut".match(/elma|muz/)); // ["elma"]
            
6. Lookahead ve Lookbehind (ES2018+)

Eşleşmeyi yaparken, eşleşen kısmın ötesindeki veya gerisindeki deseni kontrol etmenizi sağlar, ancak bu deseni eşleşmeye dahil etmez.

  • (?=desen) (Positive Lookahead): Desenin ardından desen geliyorsa eşleşir.
    
                console.log("Ali Mantar".match(/li(?= Ma)/)); // ["li"] ('Ma' ile takip edilen 'li'yi bulur, 'Ma'yı eşleşmeye dahil etmez)
            
  • (?!desen) (Negative Lookahead): Desenin ardından desen gelmiyorsa eşleşir.
    
                console.log("Mantar Ali".match(/Mantar(?! Al)/)); // ["Mantar"] ('Al' ile takip edilmeyen 'Mantar'ı bulur)
            

RegExp Nesnesi Metotları ve String Metotları ile Kullanımı

1. RegExp Metotları
  • test(string): String'in desenle eşleşip eşleşmediğini kontrol eder ve true veya false döndürür. En basit kontrol metodudur.
    
                const ifade = /deneme/;
                const metin = "Bu bir deneme metni.";
                console.log(ifade.test(metin)); // true
            
  • exec(string): Desenin string'deki bir eşleşmesini arar. Eşleşme bulursa, yakalanan grupları ve indeks bilgisini içeren bir dizi döndürür; bulamazsa null döndürür. g bayrağı ile art arda çağrıldığında sonraki eşleşmeleri bulur.
    
                const regex = /(\w+)\s(\w+)/g; // Kelime boşluk kelime
                const str = "Merhaba Dünya";
                let match = regex.exec(str);
                console.log(match); // ["Merhaba Dünya", "Merhaba", "Dünya", index: 0, ...]
    
                match = regex.exec(str); // Global bayrak olduğu için tekrar null döner çünkü başka eşleşme yok
                console.log(match); // null
            
2. String Metotları (RegExp ile Kullanımı)

JavaScript'in String nesnesinin bazı metotları da RegExp argümanı alabilir, bu da onları çok güçlü kılar:

  • string.match(regexp): String'deki tüm desen eşleşmelerini (g bayrağı ile) veya ilk eşleşmeyi döndürür.
    
                const metin = "Ali Mantar / Webkolog Ali!";
                const ifade = /[/\!]/g; // "/" veya "!" karakterleriyle eşleşir
                console.log(metin.match(ifade)); // ["/", "!"]
    
                const kelimeIfade = /\bAli/g;
                console.log(metin.match(kelimeIfade)); // ["Ali", "Ali"]
            
  • string.search(regexp): Desenin ilk eşleşmesinin indeksini döndürür. Bulamazsa -1 döndürür. g bayrağını yok sayar.
    
                console.log("Merhaba Dünya".search(/Dünya/)); // 8
                console.log("Merhaba Dünya".search(/elma/)); // -1
            
  • string.replace(regexp|substring, replacement): Desenin veya alt string'in eşleşmelerini başka bir string ile değiştirir. g bayrağı yoksa sadece ilkini değiştirir.
    
                const cumle = "Bu metinde çok fazla kelime var kelime.";
                console.log(cumle.replace(/kelime/, "sözcük")); // Bu metinde çok fazla sözcük var kelime.
                console.log(cumle.replace(/kelime/g, "sözcük")); // Bu metinde çok fazla sözcük var sözcük.
            
  • string.split(separator): Bir string'i belirtilen ayırıcıya (bir string veya RegExp) göre böler ve bir dizi döndürür.
    
                const adres = "cadde no:10, sokak:2, mahalle:A";
                console.log(adres.split(/,\s*/)); // ["cadde no:10", "sokak:2", "mahalle:A"]
            

Sonuç

JavaScript'teki Düzenli İfadeler (RegExp), metin işleme yeteneklerinizi bambaşka bir seviyeye taşıyan güçlü ve esnek araçlardır. Karmaşık metin arama ve değiştirme işlemlerinden veri doğrulamaya kadar birçok görevi tek bir satırda halletmenizi sağlarlar. Başlangıçta biraz göz korkutucu görünebilirler, ancak temel karakterleri, tekrarlayıcıları ve bayrakları öğrendikçe metinler üzerinde tam bir kontrol sahibi olduğunuzu göreceksiniz.

Unutmayın, pratik yapmak düzenli ifadelerde ustalaşmanın anahtarıdır. Kendi desenlerinizi oluşturun, farklı metinlerde deneyin ve hatalardan ders çıkarın. Metinlerin gizemli dünyası artık size açık!

Webkolog'u takipte kalın!

Hepinize bol kodlu ve başarılı projeler dilerim!

0 yorum:

Yorum Gönder