Regular Expression nedir ?

Kitabın bundan sonraki bölümlerinde Regex diye anacağım (Regexp diye kısaltılır ama okunuşu kolaylaştığı için Regex diyeceğim.) Regular Expression (Düzenli İfadeler) , belli düzeni olan karakter topluluklarının kurallı bir görüntüsünü (desen) yazarak tanımlayabileceğimiz ya da kontrolünü yapabileceğimiz bir dil olarak kabul edilebilir. Belli düzeni olan karakter topluluğu diye bahsettik ama eğer bir düzeni zaten varsa bunu programlamaya neden ihtiyaç duyuyoruz? Diyebilirsiniz. Esnek bir düzeni varsa bu toplulukların işte o zaman Regex bizim için eşi bulunmaz bir yardımcı olacaktır.

Elimizde bir figür olduğunu düşünelim. Bu figürün bir insan şekline denk gelip gelemeyeceğini nasıl tespit edebilirsiniz? Biyolojik zorunluluklar dışında bir insan şeklini tanımlamanın şartları şunlar olabilir mi ? Regex, soyut kavramları tanımlamada kullanılamadığı için vereceğim örnekler görüntü ile alakalı olacaktır.

  • 2 ayak, 2 el (her elde 5 parmak), gövde, baş, 2 göz, 2 kulak

Normal bir insan bu tanıma uyar mı? Evet, uyar ve insan ayırt etmeden bu görüntü her insan için geçerlidir. Şimdi insanlar arasından seçeceklerimize görünümle ilgili birkaç kıstas daha ekleyelim

  • Minimum boy: 180 cm

İnsanların çoğunu bu kıstaslarla eleyebiliriz aradığımız insanı bulmaya doğru gidiyoruz.

  • Gözlük, Şapka(olmayabilir)

2 ölçüt daha ekledik fakat ölçütlerin biri seçmeli oldu yani eleme işini o yapamayacak. Gözlük şartıyla yine elemiş olduk

İnsanlar arasından aradığımız insan modeline uyanları seçmek için kriterler belirledik ve aradığımıza gidebilmek için kriterleri arttırdık hatta tam sayılar vererek katılaştırdık. Regex’te de kurallarınız ne kadar katıysa o kadar kesin, bir o kadar da az sonuç alırsınız.

Regex Deseni oluşturmadan önce

Regex desenleri oluşturmaya başlamadan bir önceki metinde değindiğimiz kriterleri tek tek yazmanız ve bulabileceğiniz sonuçları tartmanızda fayda vardır. İnsan modelleme örneğine başlamadan önce şu soruları sorabilirdik: 2 ayağı olan kaç insan bulurum? , 2 gözü olan kaç insan bulurum ?. bunlar insanda ayır edici özellik değildir. Bulmak ya da elemek istediğimiz elemanlarda ayırt edici özellik aramak bizim için en kolay yöntem olacaktır. Bunları desen oluşturmadan önce tartışmamız, bazen aramadıklarımızın aradıklarımızdan daha az olduğunu gösterebilir. İsminde ünlülerden sadece “aeıioöu” harflerden birini içerenleri taramak mı kolay sizce “ü” geçmeyenleri taramak mı? Regexte bizi hızlandıracak nokta bu olacaktır. Aradıklarımız mı? Aramadıklarımız mı?

  Meta Karakterler
^ Metin Başlangıcı (multiline modunda satır başı)
$ Metin Sonu (multiline modunda satır sonu)
[ Karakter sınıfı tanımlama başlangıcı
] Karakter sınıfı tamımlama sonu
| Alternatif ayıracı, örneğin (a|b) hem a ile hem de b ile eşleşebilir
( Desen grubu başlangıcı
) Desen grubu sonu
\ Kaçış karakteri (üstte tanımlanan ( [ $ gibi karkaterlerin desenimizde özel anlamları dışında sadece karakter olarak kullanılmasında yardımcı olur)

 

Ön Tanımlı Karakter Sınıfları
\w Alfanumerik bir karakteri temsil eder [a-z0-9_]
\W Alfanumerik karakterler dışında kalan bir karakteri temsil eder [^a-z0-9_]
\s 1 birim boşluğu temsil eder (boşluk, tab,satır sonu)
\d Numerik bir karakteri temsil eder [0-9]
\D Numerik olmayan bir karakteri temsil eder [^0-9]
. Herhangi bir karakterin yerine geçebilir

 

Niceleyiciler
x* Sıfır ya da daha fazla x
x+ Bir ya da daha fazla x
x? Sıfır ya da bir tane x
x{n} N tame x
x{n,} En az n tane x
x{,n} En gazla n tane x

 

Desen Niteleyicileri (Pattern Modifiers)
i Büyük küçük harf duyarliliğini devre dışı bırakır (Ignore case sensitive)
m Multiline modu ^ ve $ satır başı ve satır sonunu temsil eder (bkz: meta karakterler ^$)
s Dotall modu – nokta “.” Set içinde kullanıldığında satır sonunu da temsil eder
x Yorum ve boş satır sonlarını görmezden gelir
e Eval modu .Sadece replace işlemlerinde geçerlidir.

 

Sınır İşaretçileri
\b Kelime sınırı
\B Kelimeler dışında kalan eşleşmeler sınırı
\A Eşleşme başlangıcı
\Z Eşleşme sonu ya da satır sonu
\z Eşleşme sonu
\G Eşleşmedeki başlangıcın indisi

 

Alt Desen Niteleyicileri ve İşaretçiler
(?:) Alt eşleşme olmama şartı Örn : ((?:tufan|baris)yildirim) diğer alt desenlerle eşleşen bir tufan ya da baris bulamadığı taktirde tufanyildirim ya da barisyildirim ile eşleşebilir.
(?=) Kendisinden sonraki eşleşme geçerliye öncesini de eşleştirirtufan(?=baris) hemen ardından baris içeriyorsa tufan ile eşleşir.
(?!) Önceki işaretçinin tersidir kendisinden sonraki eşleşmiyorsa bu eşleşme kabul edilir
(?<=) diğer işaretçilerle aynı işlemleri kendisinden öncekiler için yapar
(?<!) Önceki işaretçinin tersidir
(?(x)) Bu gruptaki ilk işaretçi için alt desen numarası ile işlem yapabilirÖrn : (?(2)tufan|baris)yildirim bu gruptaki 2inci alt grup tufan ya da baris ise burası yildirim ile eşleşebilir.
(?#) Yorum grubudur (?# bu kısım yorumlanmayacaktır açıklama yazabilir.)
(?isim) , (?’isim’) (?Pisim)Bu işaretçiler de grupları adlandırmaya yarar php’nin 5.2.2 sürümünden öncesinde sadece <?P<isim>> çalışır. Regexp standartlarında ilk örnek olan (?isim) geçerlidir.

 Dökümanın PDF versiyonu : Regular Expressions.pdf

© 2012 Tufan Suffusion theme by Sayontan Sinha