Tü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 İ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ı

<dl>

<dt>Nasıl yazıldığını tam olarak bilmediğimiz bir sözcüğü aratabiliriz.</dt>

<dd>Ö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.</dd>

<dt>Bir metnin içindeki, özel bir forma uyan parçaları bulabiliriz.</dt>

<dd>Ö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)</dd>

<dt>Aldığımız bir metnin, belli bir yapıya uyup uymadığını kontrol edebiliriz.</dt>

<dd>Ö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)</dd>

<dt>Belli formatta aldığımız bir veriyi, istediğimiz başka bir formata çevirebiliriz.</dt>

<dd>Örneğin, bir XML belgesinden kopyaladığımız veriyi, kendi uygulamamızda kullanmamız için bir php dizisi (array) haline getirebiliriz.</dd>

</dl>

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
<karakter></karakter> 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. | | <ifade><ifade></ifade></ifade> | 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. | | <ifade></ifade> | 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. | | [<karakterler>]</karakterler> | [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. | | [<karakterler>]</karakterler> | [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. | | [<karakter>-<karakter>]</karakter></karakter> | [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. | | (<ifade>)</ifade> | (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. | | <ifade></ifade> | Bas | Bir düzenli ifadenin başında yer alan ^ sembolü, o ifadenin satırın başında yer alması gerektiğini gösterir. | | <ifade>$</ifade> | 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 |

Sonuç

Bu yazımızda, düzenli ifadeleri kısaca tanıtıp, söz dizimini örneklerle açıklamaya çalıştık. Bu serinin sonraki yazılarında, düzenli ifadelerin uygulamalar içinde nasıl kullanıldığını pratik ve faydalı örneklerle görecek ve sık kullanılan bazı kalıpları sizlerle paylaşacağız. Şimdilik hoşçakalın..

Kaynaklar