Düzenli İfadeler

ürkçe adıyla düzenli ifadeler, İngilizce'si ile regular expressions, hem iyi bilgisayar kullanıcılarının hem de programcıların zaman zaman hayatlarını kurtarır. Ancak pek çok kişi tarafından gücü ve kullanım alanları yeterince bilinmez. Bu yazımızda, düzenli ifadeleri ve söz dizimini tanıtıp, pratik kullanımına örnekler vermeye çalışacağız.

Düzenli İfadelerDüzenli İfade Nedir?

Bir metnin içinde geçen "ODTÜ Bilgisayar Topluluğu" ifadesini aratmak istediğimizde, arama kutusuna "ODTÜ Bilgisayar Topluluğu" yazmamız yeterlidir. Peki ya aradığımız şey, örnekte olduğu gibi tam olarak bildiğimiz bir sözcük değilse? Örneğin, "ODTÜ ... Topluluğu" yapısına uyan tüm kalıpları bulmak istiyorsak ne yapmalıyız? "ODTÜ" ve "Topluluğu" sözcüklerini ayrı ayrı aratmak, bizi pek çok ilgisiz sonuçla karşı karşıya bırakabilir.

Aratmak istediğimiz şeyin yapısını tarif edip, bu yapıya uyan her parçayı bulmamızı sağlayan "sihirli" bir yapı olsa işimiz gerçekten çok kolaylaşırdı. Bu ihtiyaçtan yola çıkarak oluşturulan düzenli ifadeler, bize bu esnekliği sağlayan ve metin eşlemede kullanılan söz dizileridir. Düzenli ifadeleri destekleyen metin düzenleyicilerde veya programlama dillerinde aradığımız ifadeyi girerek, bu ifadeyle eşleşen kalıpları bulabiliriz.

Kullanım Amaçları

Nasıl yazıldığını tam olarak bilmediğimiz bir sözcüğü aratabiliriz.
Örneğin, bir makalede "entrepreneurship" sözcüğünü bulmak istiyosak, ancak ne şekilde yazıldığından emin değilsek, ilk ve son birkaç karakterini verip aratabiliriz.
Bir metnin içindeki, özel bir forma uyan parçaları bulabiliriz.
Örneğin, düz bir metin içindeki tüm URL'leri (İnternet adreslerini), yalnızca ana yapıyı tarif ederek, teker teker ayıklayabiliriz. (http:// ile başlayan ve arada noktalar içeren sözcükler)
Aldığımız bir metnin, belli bir yapıya uyup uymadığını kontrol edebiliriz.
Örneğin, kullanıcılardan e-posta adresi girmelerini istediğimiz bir web sayfasında, metin kutusuna girilen yazının geçerli bir e-posta adresi olabilecek formatta olup olmadığına bakabiliriz. (@ işareti içerecek, belli karakterlerden oluşacak, ikinci blokta en az bir nokta olacak vs)
Belli formatta aldığımız bir veriyi, istediğimiz başka bir formata çevirebiliriz.
Örneğin, bir XML belgesinden kopyaladığımız veriyi, kendi uygulamamızda kullanmamız için bir php dizisi (array) haline getirebiliriz.

Söz Dizimi

En basit düzenli ifadeler, tek bir karakterden oluşur. Harfler, rakamlar, noktalama işaretleri gibi pek çok karakter, kendisiyle eşleşen düzenli ifadelerdir. Yani, bir metinde a karakterini arıyorsak, girmemiz gereken düzenli ifade, doğal olarak a karakteridir. Ancak, bazı karakterler, düzenli ifadelerin söz diziminde özel anlamlar ifade eder. Bu özel karakterler, . * [ ] ^ $ sembolleridir. Aradığımız karakter, bu özel karakterlerden bir tanesiyse, başına karakteri koyarak, özel anlam içermesini engelleyebiliriz. Örneğin, bir metin içinde nokta karakterlerini bulmak istiyorsak, girmemiz gereken düzenli ifade . değil . olmalıdır.

Düzenli ifadelerin, bazı özel sembollerle bir araya gelmesi sonucu, daha güçlü ve karmaşık düzenli ifadeler elde edilir. Aşağıdaki tablo, düzenli ifadelerin nasıl elde edildiğini açıklar:

Gösterim Örnekler Açıklama
a
3
-
*
Herhangi bir büyük harf, küçük harf, rakam veya karakter, düzenli ifadelerin temel yapıtaşıdır ve kendi kendisiyle eşleşir.
. . Nokta sembolü, kendini herhangi bir karakterle eşler. Aradığımız metnin içinde geçen bir karakterin ne olduğu bizim için önemli değilse, bu karakter yerine . kullanabiliriz.
An
3:
M.r.t
Düzenli ifadeleri arka arkaya ekleyerek, daha büyük metinleri eşleyebiliriz. İlk ifadenin metinle eşlenmesinden sonra, kalan kısmın ikinci ifadeyle eşleşmesi gerekir.
* s*
.*
Yıldız sembolü, kendisinden önce geçen ifadenin kaç defa geçtiğinin önemli olmadığını gösterir. Yani bir önceki ifade, hiç geçmese de, bir kez geçse de beş kez geçse de eşleşme gerçekleşir.
[] [abcABC]
[sj3!_K]
Köşeli parantezler içinde yer alan karakterlerden oluşan bir düzenli ifade, bu karakterlerden herhangi biriyle eşleşme yapılabileceğini gösterir.
[^] [^asdF]
[^5]
Köşeli parantezler içinde bir ^ karakterinden sonra farklı karakterlerden oluşan bir düzenli ifade, bu karakterler dışında herhangi bir karakter ile eşleşme yapılabileceğini gösterir.
[-] [A-E]
[A-Za-z0-9]
Köşeli parantezler içindeki iki karakter arasında tire işareti varsa, bu iki karakter arasındaki herhangi bir karakterle eşleşme gerçekleşir. Karakterlerin nasıl dizildiği, yerel ayarlarınıza göre farklılık gösterebilir. Örneğin, [A-E] ifadesi, [ABCDE], [ABCÇDE], [AaBbCcDdE] ve [AaBbCcÇçDdE] ifadelerinden birine karşılık geliyor olabilir.
() (asd)* Parantez içindeki ifadenin tek bir düzenli ifade olarak algılanması gerektiğini belirtir. Böylece tekrar eden kısımları belirtebiliriz. Gelişmiş düzenli ifadelerde (extended regular expressions) parantezlerden önce yer alan karakterinin kullanılmasına gerek yoktur.
^ ^Bas Bir düzenli ifadenin başında yer alan ^ sembolü, o ifadenin satırın başında yer alması gerektiğini gösterir.
$ Son$ Bir düzenli ifadenin sonunda yer alan $ sembolü, o ifadenin satırın sonunda yer alması gerektiğini gösterir.

Örnek İfadeler

Küçük düzenli ifadelerin özyinelemeli olarak birbirinin içinde kullanılmasıyla, daha büyük düzenli ifadeler türetilebilir. Aşağıda, bazı düzenli ifadeler, ve bunların hangi metinlerle eşleşeceğini-eşleşmeyeceğini gösteren örnek ifadelere yer verilmiştir:

İfade Eşleştiği satırlar Eşleşmediği satırlar
ev ev
devrim
Ev
izmi. izmir
izmit
izmi
izmi.
ab*c ac
ace
abc
abbbc
ascii
a(bc)*d ad
abcd
abcbcbcd
abd
ODTÜ .* Topluluğu ODTÜ Bilgisayar Topluluğu
ODTÜ Güzel Sanatlar Topluluğu
ODTÜ Topluluğu
ODTÜ Topluluğu
an[kt]a ankara
antalya
anavatan
ankta
10[^0-3] 104
510x
10
102
[A-Z][a-z]* Ankara
Samsun
ADANA
izmir (karakter kodlamasına göre eşleşebilir)
^can can
caner
alican
can$ can
alican
caner
^can$ can caner
alican

 

 

Geçen ayki yazımızda, düzenli ifadelerin (regular expression, RegExp, ...) ne olduğundan, kullanım amaçlarından ve söz diziminden bahsedip, bir takım örnek ifadelere yer vermiştik. Bu ay, söz dizimini öğrendiğimiz düzenli ifadeleri ne şekilde kullanabileceğimizi göreceğiz.

Pratik Kullanım Alanları

Düzenli ifadeler, vi, emacs, kate gibi pek çok metin düzenleyicide; grep, sed gibi konsol uygulamalarında; Perl, Python, PHP, JavaScript gibi programlama dillerinde ve Eclipse, Visual Studio gibi geliştirme ortamlarında kullanılmaktadır. Şimdi, bu uygulamalardan bazılarını görelim ve örneklerle farklı kullanım amaçlarını tanımaya çalışalım.

grep

Grep (Global Regular Expression Parser), Linux konsol ortamında düzenli ifadeleri kullanabilmemizi sağlayan en temel programdır. Normal kullanımında iki argüman alır: "grep İFADE DOSYAADI". Dosya adı girilmezse, grep, standart girdiden okur. Örneğin "/etc/passwd" dosyasında murat ifadesi geçen satırları bastırmak için şöyle bir komut kullanabiliriz:

murat@tulliana ~ $ grep murat /etc/passwd
murat:x:1000:100:Murat Ongan:/home/murat:/bin/bash
murat@tulliana ~ $

Bu tip kelime şeklindeki ifadeleri aramanın yanı sıra, daha karmaşık düzenli ifadeleri de arayabiliriz. Örneğin ODT[UÜ] .* Toplulu[gğ]u ifadesini bir dosyada aratmak istediğimizde şöyle bir komut kullanabiliriz:

murat@tulliana ~ $ cat dosya
ODTÜ Bilgisayar Topluluğu
METU Computer Club
odtü bilgisayar topluluğu
ODTU Bilgisayar Toplulugu
ODTÜ bilgisayar Topluluğu
CClub
murat@tulliana ~ $ grep "ODT[UÜ] .* Toplulu[gğ]u" dosya
ODTÜ Bilgisayar Topluluğu
ODTU Bilgisayar Toplulugu
ODTÜ bilgisayar Topluluğu
murat@tulliana ~ $

Daha önce belirttiğimiz gibi, grep'e girdi olarak, bir dosya içeriği vermek yerine, bir komutun çıktısını da verebiliriz. Örneğin, daha önce bilgisayarımızda kullandığımız "wget" programını hangi argümanlarla çağırdığımızı hatırlamak için, şöyle bir komut deneyebiliriz:

murat@tulliana e-bergi $ history | grep wget
  530  wget http://www.domain.com/~user/foto/ -r -np -nH --cut-dirs=2 -A.JPG
  534  history | grep wget
murat@tulliana e-bergi $

KWrite - Kate

Kate, KDE masaüstü ortamının metin düzenleme aracıdır. Aynı zamanda da çok fonksiyonlu bir editör olarak kullanılabilir. KWrite da Kate'i kullanabilen basit ama kullanışlı bir metin düzenleyicidir. Bu uygulamalar, düzenli ifade kullanımını destekler ve bunun için kullanışlı bir arabirim de sunar.

Şimdi, KWrite'ta düzenli ifadeleri kullanarak nasıl arama yapıldığını bir örnek üzerinde görelim. Yukardaki resimlerde gösterildiği gibi, önce örnek metin olarak Google'ın HTML kodunu açıyoruz. Amacımız, burdaki tüm linkleri düzenli ifadeleri kullanarak bulmak. Ctrl+F tuşlarını kullanarak, ya da menüden Düzen -> Bul (Edit -> Find) seçeneğini seçerek, düzenleme penceresini açıyoruz. Bir düzenli ifade aratmak istediğimizi belirtmek için, çıkan penceredeki Düzenli ifade (Regular expression) seçeneğini işaretliyoruz. Daha sonra arama kutusuna, <a href="adres" ..> şeklindeki yapıları bulmak için <a href=[^>]*> ifadesini girip, Bul (Find) tuşuna bastığımızda, bize ilk eşleşen ifadeyi seçilmiş bir şekilde gösteriyor. Bundan sonra, menüden Düzen -> Sonrakini Bulu (Edit -> Find Next) seçerek ya da F3 tuşuna basarak bu türdeki tüm ifadeleri görebiliyoruz.

KWrite aracılığıyla düzenli ifadeleri kullanarak arama yapabildiğimiz gibi, bulduğumuz metinleri değiştirme şansına da sahibiz. Bunu da yine bir örnekle görelim. Aşağıdaki resimlerde görebileceğiniz gibi, bu sefer örnek metin olarak bir HTML formundan alınmış şehir listesini kullanıyoruz. Bu listede şehirlerin isimlerinin yanı sıra, Türkçe karakterlerden arındırılmış hali de mevcut. Bu listeyi alıp, kendi PHP sayfamızda kullanabilmek için bir dizi (array) haline çevirmek istiyoruz.

Bu sefer, menüden Düzen -> Değiştiri (Edit -> Replace) seçiyoruz ya da Ctrl+R kısayolunu kullanıyoruz. Çıkan pencerede yine Düzenli ifade (Regular expression) seçeneğini ve değiştirme işleminde bulduğumuz metinlerdeki parçaları kullanacağımızı belirtmek için Konum tutucuları kullan (Use placeholders) seçeneğini işaretliyoruz. Üstteki kutucuğa aradığımız metnin formatı olan <option value="(.*)">(.*)</option> ifadesini, alttaki kutucuğa da değiştirmek istediğimiz metnin formatı olan $dizi["1"] = "2"; ifadesini giriyoruz. Değiştir (Replace) tuşuna bastığımızda, girdimiz, yeni formatında kullanılabilir hale geliyor. Özellikle büyük ölçekte verinin formatını değiştirmek istediğimizde bu yöntemin çok işe yaradığını görüyoruz.

JavaScript

Pek çok programlama dilinde olduğu gibi, JavaScript'te de düzenli ifadelerin kullanılabildiğini biliyoruz. Özellikle web sayfalarında girilen form bilgilerini doğrulamak (form validation) için düzenli ifadelerden sıkça yararlanıyoruz. Bunun için, öncelikle bir RegExp nesnesi yaratmamız gerekiyor. Bu nesne, aşağıda gösterildiği gibi iki farklı yolla yaratılabilir. İkinci satır, birincisi için bir kısa gösterimdir yoludur.

var re = new RegExp("ifade");
var re = /ifade/;

Bu şekilde yaratılan düzenli ifade nesneleri, bu nesnelerin test metoduyla doğrulanabilir. Şimdi yine bir örnekle, JavaScript'te düzenli ifadeleri kullanarak e-posta adreslerini nasıl doğrulatabileceğimizi görelim. Web sitemizde kullanabileceğimiz doğrulama fonksiyonu ve bu fonksiyonu kullanan form kodu aşağıda gösterilmiştir. Ayrıca, bu kodun nasıl çalıştığını görmek için örnek sayfamızı inceleyebilirsiniz.

<script type="text/javascript">
function formKontrol() {
    var ifade = new RegExp("^[a-zA-Z0-9._-]+@[a-zA-Z0-9.-]+.[a-zA-Z]{2,4}$");
    // var ifade = /^[a-zA-Z0-9._-]+@[a-zA-Z0-9.-]+.[a-zA-Z]{2,4}$/;
    var adres = document.mailform.mailadresi.value;
    if (ifade.test(adres)) {
        alert("E-Posta adresiniz, kurallara uygun gözüküyor. Formunuz gönderilecek..");
        return true;
    }
    else {
        alert("E-Posta adresiniz, kurallara uygun değil. Lütfen adresi kontrol edip tekrar deneyin..");
        return false;
    }
}
</script>

<form name="mailform" onSubmit="return formKontrol()">
<input type="text" name="mailadresi" size="15">
<input type="submit" value="Gönder!">
</form>

PHP

Biraz önce JavaScript ile nasıl form doğrulama işlemi yapabileceğimizi gördük. Ancak, JavaScript özelliği kapalı olan tarayıcılardan veya bazı kötü amaçlı kişilerden gelebilecek form verilerini kontrol edebilmek için, sunucu tarfında da bir doğrulama işlemi yapmamız şarttır. PHP de düzenli ifadelerin kullanılabildiği programlama dillerinden biri olarak, form doğrulama işlemlerinde sık sık kullanılır.

PHP'de düzenli ifadeler ereg ve ereg_replace fonksiyonlarıyla kullanılır. ereg fonksiyonu, standart olarak iki argüman alır. İlk argümanda, aramak istediğimiz ifadeyi, ikinci argümanda ise aramayı yapacağımız metni girmemiz gerekir. Fonksiyon, ifadeyi metnin içinde bulabilirse 1, bulunmazsa 0 değerlerini döner. İstersek, metinde eşleşen parçaları alabilmek için, ereg fonksiyonuna üçüncü bir argüman da verebiliriz. Aşağıdaki örnekte, e-posta doğrulama işlemini bu sefer PHP ile sunucu tarafında nasıl yaptığımızı görebilirsiniz. İsterseniz örneğimizin nasıl çalıştığını görebilir ya da kodun tamamını inceleyebilirsiniz.

$ifade = "^([a-zA-Z0-9._-]+)@([a-zA-Z0-9.-]+.[a-zA-Z]{2,4})$";
if (ereg($ifade, $_POST["mailadresi"], $sonuclar)) {
    echo "<p>E-Posta adresi onaylandı. Teşekkür ederiz..</p>";
    echo "<p><b>Adres:</b> ".$sonuclar[0]."<br />";
    echo "<b>Kullanıcı Adı:</b> ".$sonuclar[1]."<br />";
    echo "<b>Alan Adı:</b> ".$sonuclar[2]."</p>";
}
else {
    echo "<p>E-Posta adresi doğrulanamadı. Lütfen geri dönüp, tekrar deneyin..</p>";
}

Gördüğünüz gibi, düzenli ifadeler, PHP'de kolay bir şekilde arama ve doğrulama yapma amacıyla kullanılabiliyor. Şimdi de ereg_replace fonksiyonu ile metinler üzerinde nasıl değişiklik yapabileceğimize dair bir örnek görelim. Bu fonksiyon, üç argümanla çağrılır. İlk argüman, aramak istediğimiz düzenli ifade; ikinci argüman, bulduğumuz metinleri değiştirmek istediğimiz ifade; üçüncü argüman da üzerinde değişiklik yapmak istediğimiz metindir. Fonksiyon, değiştirilmiş metni bize döner.

Örneğimizde, bir metnin içinde geçen, http:// ile başlayan sözcükleri tıklandığında yeni sayfada açılan bağlantılar haline getireceğiz. Bu yöntem, çeşitli Internet sitelerinde, veritabanından alınan düz metinleri html haline getirmek için sıkça kullanılmaktadır.

$metin = "
Merhaba,

ODTÜ Bilgisayar Topluluğu tarafından düzenlenen geleneksel programlama yarışmasına siz de katılabilirsiniz. Yapmanız 
gereken tek şey, ön eleme sorularına web üzerinden çözüm göndermek. Yarışma hakkında daha detaylı bilgi almak için, 
http://www.cclub.metu.edu.tr/yarisma sayfasını ziyaret edebilir, ya da 
http://www.cclub.metu.edu.tr/yarisma/2008/on_eleme_sorulari sayfasından ön eleme sorularına ulaşabilirsiniz.

Murat Ongan
ODTÜ Bilgisayar Topluluğu
http://www.cclub.metu.edu.tr/
";
echo "<p><b>Orjinal Metin:</b></p>";
echo "<p>".nl2br($metin)."</p>";

$eskiifade = "http://[^ nt,]*";
$yeniifade = "<a href='{IcerikVeri}' onclick='window.open(this.href); return false;'>{IcerikVeri}</a>";
$yenimetin = ereg_replace($eskiifade, $yeniifade, $metin);

echo "<p><b>Değiştirilmiş Metin:</b></p>";
echo "<p>".nl2br($yenimetin)."</p>";

Yukarıdaki kodun, nasıl çalıştığını görmek için ereg_replace örneğini inceleyebilirsiniz.

Düzenli ifadeler serimizin son yazısını, bir aylık aradan sonra sizlere sunuyoruz. Geçtiğimiz aylardaki iki yazımızda regular expression adı verilen ifadeleri ve kullanım alanlarını tanıtıp, çeşitli programlama dillerinde nasıl kullanabileceğimizi örneklerle gördük. Bu ay, önceki yazılarımızda belirtmediğimiz birkaç önemli noktaya değinecek ve sık kullanılan çeşitli kalıpları göreceğiz.

Düzenli İfade Türleri

Temel Düzenli İfadeler

POSIX standartında yer alan basic regular expressions (BRE), en genel kabul görmüş düzenli ifade standartlarından biridir. İlk yazımızda yer alan sözdizimi, temel düzenli ifade standardına uygundur. Bu standart, DFA (Deterministic Finite Automata)'lar tarafından kabul edilen dille, yani düzenli ifadelerin teorik temelleriyle örtüşür.

Genişletilmiş Düzenli İfadeler

Temel düzenli ifadeler, kullanım kolaylığı sağlanması için farklı özellikler eklenerek geliştirilmiş ve genişletilmiş düzenli ifadeler, yani extended regular expression (ERE) standardı oluşturulmuştur. ERE de POSIX standardında yer almaktadır. Genişletilmiş düzenli ifadelerde kullanılabilen ek ifade yöntemleri şunlardır:

Gösterim İfade Eşleşme Açıklama
? (e-)?bergi bergi
e-bergi
Soru işareti, kendinden önce gelen parçanın metin içinde 0 veya 1 kere yer alacağını belirtir.
+ izmir+ izmir
izmirrr
Artı sembolü, önceki düzenli ifade parçasının en az bir kere geçmesi gerektiğini belirtir. Bir üst limit yoktur.
| (b|d)ergi bergi
dergi
"veya" sembolü, iki tarafındaki regular expression parçalarından birinin bulunması gerektiğini ifade eder.

Perl Düzenli İfadeleri

Perl, düzenli ifadelerin ilk kullanıldığı programlama dillerden biri olarak, çok gelişmiş regular expression kütüphanelerinden birine sahiptir ve kendine özgü bir sözdizimi mevcuttur. POSIX standartlarından bir miktar farklılık gösteren bu türün ayrıntılarına bu yazıda değinmeyeceğiz.

Karakter Sınıfları

Düzenli ifadelerin kullanımında, [A-Za-z0-9] gibi karmaşık görünümlü parçaları sadeleştirebilmek için, bazı öntanımlı karakter grupları yaratılmıştır. POSIX standardında veya bazı özel uygulamalarda tanımlı önemli karakter gruplarını ve karşılıklarını aşağıda bulabilirsiniz:

İfade POSIX Sınıfı Karşılık Açıklama
w [[:alnum:]] [A-Za-z0-9] Alfanümerik karakterler (harfler ve rakamlar)
W   [^A-Za-z0-9] Alfanümerik olmayan karakter
d [[:digit:]] [0-9] Rakamlar
D   [^0-9] Rakam olmayan karakter
s [[:space:]] [ tnrvf] Beyaz (whitespace) karakterler
S   [^ tnrvf] Beyaz (whitespace) olmayan karakter
  [[:alpha:]] [A-Za-z] Harfler
  [[:lower:]] [a-z] Küçük harfler (karşılık gelen ifade, karakter kodlamasına göre farklılık gösterebilir)
  [[:upper:]] [A-Z] Büyük harfler (karşılık gelen ifade, karakter kodlamasına göre farklılık gösterebilir)
  [[:punct:]]   Noktalama işaretleri
A   ^ Metin başlangıcı
Z   $ Metin sonu
b     Sözcük sınırı
B     Sözcük sınırı dışında konum

Metin Ayrıştırma

Düzenli ifadeleri, metin eşleme (pattern matching) ve doğrulama (validation) amaçları dışında, metin ayrıştırma (parsing) ve değiştirme (replacement) amaçları için de kullanabiliriz. Bunun için, Regular Expression sözdiziminde karakterinden sonra gelen bir rakam, daha önce geçmiş bir metin parçasına referans olarak kullanılır (back reference). Metin parçaları olarak da parantez içindeki gruplar alınır (capturing group). Örneğin, aşağıdaki metni ele alalım:

color:black

Bu metinle eşleşmesi için şöyle bir regular expression tanımlarsak:

(.*):(.*)

Eşleşen ifadede 1, "color" parçasına, 2 de "black" parçasına karşılık gelir. ifadesi de eşleşen metnin tümünü göstermek için kullanılır. Buna göre regular expressin desteği bulunan bir metin editöründe "aranan metin" kısmına (.*):(.*), "değiştirilecek metin" kısmına 1=2 yazarak "color=black" metnini; 2:1 yazarak da "black:color" metnini elde ederiz.

1 gibi ifadeleri değiştirme metinlerinin içinde kullanabileceğimiz gibi, düzenli ifadelerin kendisinde de kullanabiliriz. Örneğin, bir metin içindeki pekiştirme sıfatlarını bulmak istiyorsak, aşağıdaki gibi bir regular expression yazabiliriz:

b(w{2})[prsm]1w*b

Bu ifade, kelime sınırları (b) içinde önce iki karakter arar (w{2}), üçüncü karakter olarak p, r, s, m harflerinden biriyle ([prsm]) ve sonra ilk iki eşleştiği harfle tekrar eşleşmeye çalışır. (1 ifadesi, önceki paranteze referanstır) Daha sonra da kelime, farklı harflerle devam eder. Bu açıklamamıza göre ifade, "masmavi", "yemyeşil", "sapsarı" benzeri sözcüklerle eşleşecektir.

Sık Kullanılan Kalıplar

Bu bölümde sık kullanılan düzenli ifade kalıplarından ikisini detaylı bir şekilde açıkladıktan sonra, birkaç tane de örneği detaylarına inmeden sizinle paylaşacağız.

IP Adresi

Bilgisayarların İnternet'teki konumunu belirten IP adresleri, 144.122.199.90 formatında, nokta karakterleriyle ayrılmış dört sayıdan oluşurlar. Her bir sayı, 0'dan 255'e kadar değer alabilir. Bunları bilerek, bir metin içindeki IP adreslerini bulmaya yarayan bir regular expression yazmak istiyoruz. İlk olarak, aşağıdaki gibi bir düzenli ifade geliştirebiliriz.

b(d{1,3}).(d{1,3}).(d{1,3}).(d{1,3})b

Bu ifade, bir kelime halinde bulunan (b ifadeleri kelime sınırını belirtir) IP adreslerini bulmaya çalışır. Her (d{1,3}) ifadesi 1-3 rakamlı sayılarla, aralardaki . ifadeleri de noktalarla eşleşeceğinden bu regular expression, tüm IP adresleriyle eşleşecektir. Düzenli ifadelerde nokta, normalde özel bir anlam ifade ettiğinden, gerçekten nokta karakterini belirtmek istediğimizde başına bir karakteri koymaya dikkat etmemiz gerekir.

Yazdığımız düzenli ifade, istediğimiz gibi tüm düzenli ifadelerle eşleşiyor; ancak 305.324.564.987 gibi 256'dan büyük sayılar içerdiğinden IP adresi olamayacak kelimelerle de eşleşir. Sayıların 0-255 aralığında olduğunu, kullandığımız programlama dilinde 1 4 gibi referanslarla kontrol edebileceğimiz gibi, düzenli ifadenin kendisinde de yapabiliriz. Bunun için d{1,3} parçalarını (25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?) benzeri parçalarla değiştirmemiz gerekir.

E-Posta Adresi

E-Posta adreslerini bulan/doğrulayan bir düzenli ifade yazmak dikkat gerektiren bir iştir. Çünkü içinde pek çok kural barındırır. Bu kurallar, RFC 822 denilen bir standartta belirtilmiştir ve hepsini kontrol etmek çok zordur. Bu nedenle, e-posta kontrolü yapan bir düzenli ifade yazıyorsak, mümkün olduğu kadar düzenli ifadeyi karışık hale getirmeden, tüm mail adresleri ile eşleşmeyecek olsa da en azından %99 doğruluk oranına sahip bir regular expression yazmamız gerekir.

Aşağıdaki ifade, basitçe bir metnin e-posta adresi belirtip belirtmediğini kontrol etmek için bir @ işareti, bunun solunda bir kullanıcı adı, sağında da noktalarla ayrılmış bir alanadı bulmaya çalışır.

^([w.-_+%]+)@([w.-]+.[w]{2,6})$

Bu ifade, pek çok e-posta adresi için doğru sonuç verir. Ancak, "murat@144.122.199.90" benzeri IP içeren e-posta adresleri ile eşleşmez. Ayrıca, "user@domain....com" gibi birden fazla noktalama işaretinin yanyana gelip gelmediğini, kullanıcı adının sembolle değil harfle başladığını ve daha pek çok ayrıntıyı kontrol etmez. Bundan daha detaylı ve doğruluk oranı daha yüksek bir regular expression istiyorsak, örneğin IP adresli e-posta adreslerini de kabul etmek istiyorsak, aşağıdaki ifadeyi kullanabiliriz:

^([w.-_+%]+)@(([([0-9]{1,3}.){3}[0-9]{1,3}])|(([w-]+.)+)([a-zA-Z]{2,6}))$

Eğer %100'e en yakın bir doğruluk oranına ihtiyacımız varsa, burdaki gibi çok daha uzun bir regular expression kullanabiliriz. Ancak, bu kadar ayrıntılı bir ifade yerine, ihtiyacımız olan doğruluk oranını belirleyip, buna uygun bir ifade kullanmamız en iyisidir.

Unutmamalıyız ki bir metin, RFC 822 denilen standarta uysa bile gerçek bir mail adresi belirtmeyebilir. Örneğin, qwe@asd.zxc adresinin sonunda geçen ve top-level domain address denen zxc kısmı, şu an dünyada İnternet adreslerini yöneten ICANN tarafından tanımlanmış bir top-level domain değildir. Yani bu kısmı da geçerli adresler listesinden kontrol etmek gerekebilir. Ne var ki, bu liste de (.tv, .com, .net, .org, .info, .museum, .tr, .uk, ...) sürekli değişmektedir. Bunun yanında, e-posta adresinin son kısmını doğrulasak bile, gerçekten öyle bir alan adı ve o alanadı altında öyle bir e-posta hesabı olduğundan emin olamayız. Yani, bir e-posta adresini, yalnızca gerçekten e-posta göndererek doğrulayabiliriz. Tabii ki bunu düzenli ifadeleri kullanarak yapmak mümkün değildir.

Diğer Örnekler

Tür İfade Eşleşen İfadeler
URL ^((https?)|(ftp))://([a-zA-Z0-9]([a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?.)+[a-zA-Z]{2,6}$ http://e-bergi.com
https://www.cclub.metu.edu.tr
ftp://ftp.linux.org.tr
Telefon Numarası ^[+]90[-]d{3}[-]d{3}[-]d{4}$ +90-555-123-4567
+90-232-000-9999
Tarih ^(0[1-9]|[12][0-9]|3[01]).(0[1-9]|1[012]).(19|20)dd$ 01.08.2008
18.05.1987
31.02.1900
Saat ^([01][0-9]|2[0-3]):([0-5][0-9])$ 00:00
23:59

 

Kaynak e-bergi.com/2008/Agustos/Duzenli-Ifadeler-3

 


Yorumunuzu Ekleyin


Yükleniyor...
    Yükleniyor...