Neler yeni

Yazılım Forum

Tüm özelliklerimize erişmek için şimdi bize katılın. Kayıt olduktan ve giriş yaptıktan sonra konu oluşturabilecek, mevcut konulara yanıt gönderebilecek, itibar kazanabilecek, özel mesajlaşmaya erişebilecek ve çok daha fazlasını yapabileceksiniz! Bu hizmetlerimiz ise tamamen ücretsiz ve kurallara uyulduğu sürece sınırsızdır, o zaman ne bekliyorsunuz? Hadi, sizde aramıza katılın!

Regex (Düzenli İfadeler) ile Güçlü Metin İşleme Betikleri Oluşturma Rehberi

Giriş: Regex Nedir ve Neden Önemlidir?
Metin işleme, yazılım geliştirmenin ayrılmaz bir parçasıdır. Log dosyalarını analiz etmek, kullanıcı girdilerini doğrulamak, belirli veri desenlerini ayıklamak veya büyük metin bloklarında değişiklik yapmak gibi pek çok görevde metinle uğraşırız. İşte tam da bu noktada Düzenli İfadeler, kısa adıyla Regex (Regular Expressions), devreye girer. Regex, metin içerisinde belirli bir arama desenini (pattern) tanımlamamızı sağlayan güçlü ve esnek bir dil olup, bu desenleri kullanarak metinlerde gelişmiş arama, bulma, değiştirme ve doğrulama işlemleri yapmamıza olanak tanır.
Regex'in gücü, basit karakter dizilerinden çok daha karmaşık ve dinamik desenleri tek bir ifadeyle tanımlayabilmesinden gelir. Örneğin, tüm e-posta adreslerini, telefon numaralarını, tarihlerini veya belirli bir formatta yazılmış herhangi bir bilgiyi saniyeler içinde bulabiliriz. Bu, manuel metin işleme yöntemlerine kıyasla muazzam bir zaman tasarrufu ve hata oranında düşüş sağlar. Bu rehberde, Regex'in temel yapısından başlayarak, sık kullanılan metotlarına ve pratik uygulamalarına kadar geniş bir yelpazeyi ele alacağız. Amacımız, metin işleme betiklerinizi Regex ile nasıl daha güçlü, verimli ve hata toleranslı hale getirebileceğinizi göstermektir.

Regex'in Temel Yapı Taşları
Regex, özel karakterler (metakarakterler) ve sıradan karakterlerin birleşimiyle oluşturulur. Bu karakterler, aradığımız deseni tanımlayan bir "kalıp" oluşturur. İşte bazı temel yapı taşları:

  • Sıradan Karakterler (Literals): Kendi anlamlarına sahiptirler. Örneğin, "a", "b", "1", "2" gibi karakterler doğrudan o karakteri arar. "Merhaba" desenini aradığınızda, tam olarak "Merhaba" kelimesini ararsınız.
  • Metakarakterler: Özel anlamları olan karakterlerdir ve bir deseni tanımlamada kritik rol oynarlar. Örneğin, nokta (.) herhangi bir tek karakteri temsil ederken, yıldız (*) önceki karakterin sıfır veya daha fazla tekrarını temsil eder.
  • Karakter Sınıfları: Belirli karakter gruplarını temsil eder. Örneğin, [0-9] tüm rakamları, [a-z] tüm küçük harfleri temsil eder.
  • Nicelik Belirleyiciler (Quantifiers): Bir karakterin veya grubun kaç kez tekrarlanabileceğini belirtir. Örneğin, {3} tam olarak 3 kez, {1,5} 1 ila 5 kez tekrar demektir.
  • Çapalar (Anchors): Desenin metin içerisinde nerede başlaması veya bitmesi gerektiğini belirtir. Örneğin, ^ satırın başlangıcını, $ satırın sonunu temsil eder.

Sık Kullanılan Metakarakterler ve Anlamları
Regex'i etkili bir şekilde kullanabilmek için bu özel karakterleri iyi anlamak önemlidir.

  • . (Nokta): Yeni satır karakteri hariç herhangi bir tek karakteri eşleştirir.
    Kod:
    a.b   -> "axb", "a?b", "a9b" ile eşleşir, "ab" ile eşleşmez.
  • * (Yıldız): Kendisinden önceki karakterin sıfır veya daha fazla tekrarını eşleştirir.
    Kod:
    ab*c  -> "ac", "abc", "abbc", "abbbbc" ile eşleşir.
  • + (Artı): Kendisinden önceki karakterin bir veya daha fazla tekrarını eşleştirir.
    Kod:
    ab+c  -> "abc", "abbc", "abbbbc" ile eşleşir, "ac" ile eşleşmez.
  • ? (Soru İşareti): Kendisinden önceki karakterin sıfır veya bir tekrarını (isteğe bağlı) eşleştirir.
    Kod:
    ab?c  -> "ac", "abc" ile eşleşir, "abbc" ile eşleşmez.
  • [ ] (Köşeli Parantezler): İçindeki karakterlerden herhangi birini eşleştirir. Bir karakter kümesi tanımlar.
    Kod:
    [aeiou] -> Herhangi bir küçük ünlü harfi eşleştirir.
    [0-9]     -> Herhangi bir rakamı eşleştirir.
    [a-zA-Z]  -> Herhangi bir harfi eşleştirir.
  • {n}, {n,}, {n,m} (Süslü Parantezler): Nicelik belirticilerdir.
    Kod:
    a{3}    -> "aaa" ile eşleşir.
    a{2,}   -> "aa", "aaa", "aaaa" vb. ile eşleşir.
    a{1,3}  -> "a", "aa", "aaa" ile eşleşir.
  • ( ) (Normal Parantezler): Gruplama ve yakalama (capturing) için kullanılır. Bir deseni birim olarak ele almayı sağlar ve eşleşen parçaları ayrı ayrı yakalamak için kullanılır.
    Kod:
    (ab)+   -> "ab", "abab", "ababab" ile eşleşir.
  • | (Dikey Çizgi): "Veya" anlamına gelir. İki veya daha fazla alternatif desen arasında seçim yapar.
    Kod:
    elma|armut -> "elma" veya "armut" ile eşleşir.
  • \ (Ters Eğik Çizgi): Özel anlamı olan metakarakterleri "kaçış" (escape) için veya özel karakter sınıflarını tanımlamak için kullanılır.
    Kod:
    \.\\      -> Gerçek bir nokta karakterini eşleştirir. (aksi halde . herhangi bir karakteri eşleştirirdi)
    \d      -> Herhangi bir rakamı eşleştirir ([0-9] ile aynı).
    \D      -> Rakam olmayan herhangi bir karakteri eşleştirir.
    \s      -> Herhangi bir boşluk karakterini (boşluk, tab, yeni satır vb.) eşleştirir.
    \S      -> Boşluk olmayan herhangi bir karakteri eşleştirir.
    \w      -> Herhangi bir kelime karakterini (harf, rakam veya alt çizgi) eşleştirir ([a-zA-Z0-9_] ile aynı).
    \W      -> Kelime olmayan herhangi bir karakteri eşleştirir.
  • ^ (Şapka): Satırın başlangıcını eşleştirir.
    Kod:
    ^Merhaba -> "Merhaba dünya" ile eşleşir, "dünya Merhaba" ile eşleşmez.
  • $ (Dolar İşareti): Satırın sonunu eşleştirir.
    Kod:
    dünya$  -> "Merhaba dünya" ile eşleşir, "dünya Merhaba" ile eşleşmez.

Pratik Örneklerle Regex Metin İşleme
Şimdi bu temel bilgileri kullanarak gerçek dünya problemlerini nasıl çözebileceğimize bakalım. Çeşitli programlama dillerinde Regex kullanımının temelleri benzerdir, ancak fonksiyon çağrıları farklılık gösterebilir. Burada genel Regex desenlerine odaklanacağız.

1. E-posta Adresi Doğrulama
E-posta adresleri genellikle belirli bir formata sahiptir: `kullaniciadi@domain.com`. Oldukça karmaşık olabilse de, temel bir doğrulama deseni şuna benzer olabilir:
Kod:
^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$
  • ^[a-zA-Z0-9._%+-]+: E-posta adresinin başlangıcında kullanıcı adını eşleştirir. Harfler, rakamlar, nokta, alt çizgi, yüzde, artı ve eksi işaretleri içerebilir ve en az bir tane olmalıdır.
  • @: "@" işaretini tam olarak eşleştirir.
  • [a-zA-Z0-9.-]+: Alan adını eşleştirir. Harfler, rakamlar, nokta ve eksi işaretleri içerebilir ve en az bir tane olmalıdır.
  • \.: Alan adındaki noktayı eşleştirir (nokta özel bir karakter olduğu için kaçış karakteri \ ile belirtilir).
  • [a-zA-Z]{2,}$: Üst düzey alan adını (TLD) eşleştirir. En az iki harften oluşmalı ve satırın sonunda olmalıdır.

2. URL'leri Metinden Ayıklama
Bir metin bloğundan tüm URL'leri çekmek isteyebilirsiniz. Basit bir URL deseni şu şekilde olabilir:
Kod:
https?:\/\/(www\.)?[-a-zA-Z0-9@:%._\+~#=]{1,256}\.[a-zA-Z0-9()]{1,6}\b([-a-zA-Z0-9()@:%_\+.~#?&//=]*)
Bu desen biraz daha karmaşıktır.
  • https?:\/\/: "http://" veya "https://" protokolünü eşleştirir. 's?' kısmı 's' harfinin isteğe bağlı olduğunu belirtir.
  • (www\.)?: "www." kısmının isteğe bağlı olduğunu belirtir.
  • [-a-zA-Z0-9@:%._\+~#=]{1,256}: Alan adının ilk kısmını eşleştirir.
  • \.[a-zA-Z0-9()]{1,6}: Üst düzey alan adını (örn. .com, .org) eşleştirir.
  • \b([-a-zA-Z0-9()@:%_\+.~#?&//=]*): URL'nin geri kalan yol ve sorgu parametrelerini eşleştirir. '\b' kelime sınırını belirtir.

3. Tarih Formatlarını Bulma ve Dönüştürme
Farklı formatlardaki tarihleri bulmak veya standart bir formata dönüştürmek isteyebilirsiniz. Örneğin, "GG.AA.YYYY" formatındaki tarihleri bulalım:
Kod:
\b\d{2}\.\d{2}\.\d{4}\b
  • \b: Kelime sınırı.
  • \d{2}: İki basamaklı bir rakam (gün).
  • \.: Nokta karakterini eşleştirir.
  • \d{2}: İki basamaklı bir rakam (ay).
  • \.: Nokta karakterini eşleştirir.
  • \d{4}: Dört basamaklı bir rakam (yıl).
  • \b: Kelime sınırı.
Eğer bu tarihleri "YYYY-AA-GG" formatına dönüştürmek isterseniz, çoğu programlama dili Regex yakalama grupları (capturing groups) ile değiştirme (replacement) fonksiyonları sunar. Örneğin, Python'da `re.sub` ile:
Kod:
import re

text = "Toplantı 01.03.2023 tarihinde gerçekleşti."
pattern = r"(\d{2})\.(\d{2})\.(\d{4})"
replacement = r"\3-\2-\1" # \3 yıl, \2 ay, \1 gün

new_text = re.sub(pattern, replacement, text)
print(new_text) # Çıktı: Toplantı 2023-03-01 tarihinde gerçekleşti.
Yukarıdaki örnekte, parantezler içindeki `(\d{2})`, `(\d{2})`, `(\d{4})` kısımları sırasıyla 1., 2. ve 3. yakalama gruplarını oluşturur. Değiştirme ifadesinde `\1`, `\2`, `\3` ile bu yakalanan gruplara referans verilir.

4. XML/HTML Etiketlerini Ayıklama veya Değiştirme (Dikkatli Kullanım!)
Regex ile XML veya HTML ayrıştırmak genellikle önerilmez (çünkü bu diller düzenli bir dil değil, bağlamdan bağımsız bir dil yapısına sahip değillerdir), ancak basit durumlarda kullanılabilir. Örneğin, sadece basit bir HTML etiketini kaldırmak isterseniz:
Kod:
<.*?>
  • <: Açılış etiketini eşleştirir.
  • .*?: Herhangi bir karakterin sıfır veya daha fazla tekrarını eşleştirir. Soru işareti (?) burada "greediness" (açgözlülük) davranışını engeller; yani en kısa eşleşmeyi bulur. Olmasaydı, ilk açılış etiketinden son kapanış etiketine kadar her şeyi eşleştirebilirdi.
  • >: Kapanış etiketini eşleştirir.
Önemli Not: HTML veya XML ayrıştırmak için Regex kullanmak genellikle iyi bir fikir değildir. Bu dillerin yapısı gereği, çok karmaşık senaryolarda Regex hatalara yol açabilir. Bunun yerine, özel olarak tasarlanmış ayrıştırıcı kütüphaneler (örneğin Python'da BeautifulSoup, JavaScript'te DOMParser) kullanmak daha güvenli ve sağlamdır.

Regex Betiklerinde Performans ve En İyi Uygulamalar
Regex güçlü olsa da, kötü yazılmış bir desen performans sorunlarına yol açabilir, hatta programınızın kilitlenmesine neden olabilir (Regex Denial of Service - ReDoS saldırıları). İşte bazı en iyi uygulamalar:

  • Mümkün Olduğunca Spesifik Olun: Geniş kapsamlı desenler (`.*`, `.+`) kullanmaktan kaçının. Örneğin, bir sayıyı arıyorsanız `\d+` kullanın, `.+` değil.
  • Test Edin ve Yine Test Edin: Regex desenlerinizi Regex101.com veya RegExr.com gibi online araçlarla farklı metinler üzerinde test edin. Bu araçlar deseninizin nasıl çalıştığını görselleştirmenize yardımcı olur.
  • Azami Açgözlülük (Greediness) ve Asgari Açgözlülük (Laziness): Varsayılan olarak nicelik belirleyiciler ( `*`, `+`, `{}`) "açgözlüdür", yani mümkün olan en uzun eşleşmeyi bulmaya çalışırlar. Eğer en kısa eşleşmeyi istiyorsanız, nicelik belirleyicinin arkasına bir soru işareti (?) ekleyin (örneğin `*?`, `+?`).
    Kod:
    Metin: "<a>bir</a><b>iki</b>"
    Desen: /<.*>/  -> Eşleşir: "<a>bir</a><b>iki</b>" (açgözlü)
    Desen: /<.*?>/ -> Eşleşir: "<a>", "<b>" (açgözlü olmayan - "lazy")
  • Yakalama Gruplarını (Capturing Groups) Akıllıca Kullanın: Sadece ihtiyacınız olan kısımları yakalayın. Eğer sadece gruplama yapmak istiyor ancak yakalamak istemiyorsanız `(?:...)` sözdizimini kullanın (yakalama yapmayan grup). Bu performans artışı sağlayabilir.
  • Düzenli İfadeleri Önceden Derleyin (Compiled Regex): Özellikle bir betikte aynı Regex desenini tekrar tekrar kullanacaksanız, çoğu dilde deseni önceden derlemek performansı artırır. Örneğin Python'da:
    Kod:
    import re
    compiled_pattern = re.compile(r"(\d{3})-(\d{2})-(\d{4})")
    # Artık compiled_pattern objesini search, match, findall vb. için kullanabilirsiniz.
    match = compiled_pattern.search("Telefon numaram: 123-45-6789")
    if match:
        print(f"Bölge Kodu: {match.group(1)}, Ön Ek: {match.group(2)}, Son Hane: {match.group(3)}")
  • Metin İşleme Kütüphaneleri: Regex'in tek çözüm olmadığını unutmayın. Basit string işlemleri için dilin yerleşik string metotları (split, replace, find) genellikle daha hızlı ve okunabilirdir. Daha karmaşık yapısal ayrıştırmalar için özel kütüphaneler (JSON, XML ayrıştırıcılar) tercih edilmelidir.

Sonuç
Regex, metin işleme betiklerinizi bir üst seviyeye taşıyacak inanılmaz güçlü bir araçtır. Öğrenme eğrisi biraz dik olsa da, bir kez temel prensiplerini kavradığınızda, karmaşık metin manipülasyonu görevlerini şaşırtıcı bir kolaylıkla yerine getirebilirsiniz. Unutmayın ki, iyi bir Regex deseni hem etkili hem de okunabilir olmalıdır. Pratik yaparak, farklı senaryolar üzerinde deneyler yaparak ve mevcut kaynaklardan faydalanarak Regex yetkinliğinizi sürekli geliştirebilirsiniz. Bu rehberin, Regex dünyasına sağlam bir adım atmanıza yardımcı olduğunu umuyoruz. Metin işleme maceralarınızda başarılar dileriz!
 
shape1
shape2
shape3
shape4
shape5
shape6
Üst

Bu web sitenin performansı Hazal Host tarafından sağlanmaktadır.

YazilimForum.com.tr internet sitesi, 5651 sayılı Kanun’un 2. maddesinin 1. fıkrasının (m) bendi ve aynı Kanun’un 5. maddesi kapsamında Yer Sağlayıcı konumundadır. Sitede yer alan içerikler ön onay olmaksızın tamamen kullanıcılar tarafından oluşturulmaktadır.

YazilimForum.com.tr, kullanıcılar tarafından paylaşılan içeriklerin doğruluğunu, güncelliğini veya hukuka uygunluğunu garanti etmez ve içeriklerin kontrolü veya araştırılması ile yükümlü değildir. Kullanıcılar, paylaştıkları içeriklerden tamamen kendileri sorumludur.

Hukuka aykırı içerikleri fark ettiğinizde lütfen bize bildirin: lydexcoding@gmail.com

Sitemiz, kullanıcıların paylaştığı içerik ve bilgileri 6698 sayılı KVKK kapsamında işlemektedir. Kullanıcılar, kişisel verileriyle ilgili haklarını KVKK Politikası sayfasından inceleyebilir.

Sitede yer alan reklamlar veya üçüncü taraf bağlantılar için YazilimForum.com.tr herhangi bir sorumluluk kabul etmez.

Sitemizi kullanarak Forum Kuralları’nı kabul etmiş sayılırsınız.

DMCA.com Protection Status Copyrighted.com Registered & Protected