Regular Expressions : Özel Karakterler
Yazan : Yusuf Nar, Eylül 08, 2006, Cuma 15:55
Etiket(ler) : özel karakterler, regex
Regex ifadeleri sadece basit literal'leri aramak için kullanılmamaktadır. Zaten basit aramalar yapmak için ilgili programlama dilinde kullanabileceğimiz metodlar mutlaka vardır. Gelişmiş regex ifadeleri oluşturmak için ihtiyaç duyduğumuz özel karakterler vardır. Bu karakterler;
Açılan köşeli parantez : [
Ters bölü : \
Caret : ^
Dolar işareti : $
Nokta ., Soru işareti ?, Yıldız * ve Artı +
Pipe : |
Açılan parantez (, ve kapanan parantez )
Bu karakterleri bir metinde bulmak istersek öncesinde \ karakteri kullanmamız gerekir. Örneğin 1+ ifadesini literal olarak yani yazıldığı gibi aramak istersek 1\+ regex ifadesi kullanmalıyız. regex olarak 1+ kullanılırsa + karakteri özel bir anlam kazanacaktır ve farklı ifadellerle eşleşecektir.
Özel karakterler yanlış kullanılırsa hata mesajı alınır. Örneğin +1 regex ifadesi hataladır ve exception döner.
Ters bölü işareti \ özel karakterlerle kullanıldığında onların literal olarak eşleşmesini sağlarken diğer karakterlerden önce kullanıldığında onlara farklı bir anlam verir. \ karakteri bunun için sihirli bir karakterdir ve kullanım alanlarını iyi bilmek gerekir.
Özel Karakterler ve Programlama Dilleri
Belki birşey dikkatinizi çekmiştir. Çoğu programlama dilinde özel karakter olarak kullanılan tek tırnak ve çift tırnak karakterleri Regular Expressions'da özel karakter değillerdir. Buna dikkat etmek gerekir. Özellikle regex tabanlı arama yapan text editörlerinde tek tırnağı ararken sadece bir tek tırnak kullanmak gerekir.
Ayrıca ters bölü işaretini kullanırken dikkat etmek gerekir. Örneğin c:\windows ifadesini eşleştirmek için kullanacağımız regex ifadesi c:\\windows olmalıdır. Bunu bir programlama dilinde tanımlarken ise (örneğin C Sharp'ta) küçük bir değişiklik yapmak gerekir. Çünkü C Sharp'ta da string ifadelerinde ters bölü işareti özel bir karakterdir ve ters bölü işaretini string tanımlamalarında yada atamalarında kullanmak için ya iki tane ters bölü kullanılır yada atanan string değerinin önüne bu string bir literaldir ve olduğu gibi algılanmalıdır manasına gelen @ işareti konulur. Sanırım örneklerle konu daha iyi anlaşılacaktır.
Aşağıdaki atama C Sharp'ta hatalıdır. Çünkü ters bölü karakteri özel bir karakterdir ve compiler farklı yorumlamaya çalışır.
string klasor = "c:\windows";
Aşağıdaki ifade doğrudur. \\ compiler tarafında \ (tek ters bölü) olarak algılanır.
string klasor = "c:\\windows";
Yukarıdaki ifadenin yerine şu ifade de kullanılabilir. Aynı manaya gelir. \ işaretinin özel bir manaya gelmediğini ve tanımlanan string değişkeninin yazıldığı gibi olduğunu ifade eder.
string klasor = @"c:\windows";
Regex ifadelerinde de \ işaretinin özel bir anlamı olduğu için c:\windows ifadesiyle eşleşecek olan regex ifadesi aşağıdakilerden biri olmalıdır.
string klasor = "c:\\\\windows";
string klasor = @"c:\\windows";
İlk ifadedeki ters bölülerden iki tanesi C Sharp compiler tarafından kalanlardan biri de Regex compiler tarafından elenir diyebiliriz.