Regex oldukça kapsamlı bir kullanım alanı olan bir metin arama kurallar tanımıdır.
Wikipedia'ya göre Regex,
Bilgisayarcılıkta düzenlemeli ifadeler, ele alınan metindeki kimi katarların kısa yoldan ve esnek bir biçimde belirlenmesini sağlar. Bu katarlar belli karakterler, kelimeler veya karakter örüntüleri olabilir. Düzenlemeli ifadeler, bir biçimsel dil kullanarak yazılır ve bir düzenlemeli ifade işleyici tarafından yorumlanır. Bir düzenlemeli ifade işleyici, ya ayrıştırıcı üreteci olarak hizmet eden ya da metni inceleyip verilen tarife uygun kısımlarını belirleyen bir programdır.
Örnek
Yapacağımız bu örnekte kaynak bir metin içerisinde, girilen bir kelimenin kaç adet geçtiğini bulacağız.
Formumuzun taracıdaki görüntüsü bu şekilde olacak. Bu görüntüdeki örnekte bir metin içerisinde "the" kelimesinin kaç adet geçtiğini sorguluyoruz. Sayfanın alt tarafında da kelimenin 11 adet geçtiği bilgisinin göründüğünü görebilirsiniz.
Sürecin akış görünümü aşağıdaki gibidir.
Form Verimiz aşağıdaki şekilde olacaktır.
Sürecin form görünümü aşağıdaki gibidir.
Buton olarak doğrudan HTML markup kullandık. Amacımız kullanıcı "Ara" butonuna tıkladığında sayfanın postback olması ve FormScript kodlarının çalışmasını sağlamak. Bunu farklı şekillerde de sağlayabilirsiniz. Örneğin "Arama Metni" metin kutusunun özelliklerine girip "Değiştiğinde formu yenile" seçeneğini seçebilirsiniz.
<input type="button" id="btnPostback" name="Ara" type="button" value="Ara" onclick="javascript:setTimeout('__doPostBack(\'btnPostback\',\'\')', 0)"></input>
Formumuzu tasarladıktan sonra Form Script içerisine Regex kodumuzu yazmamız gerekiyor. Ancak biz bu örnekte bir metot içerisine yazıp kodlarımızı ayırdık. Böylece uzun ve karmaşık kodların okunabilirliği artmış olacaktır.
"RegexArama" adındaki metot Form Script içerisinden çağırılmaktadır.
"RegexArama" metodumuzun içerisindeki kodumuz bu şekilde.
<Script Name=""> <If> <Then> <Condition> <And> <Not> <IsEmpty> <Evaluate Target="None" Culture=""><![CDATA[/*/LongText/Source]]></Evaluate> </IsEmpty> </Not> <Not> <IsEmpty> <Evaluate Target="None" Culture=""><![CDATA[/*/LongText/Keyword]]></Evaluate> </IsEmpty> </Not> </And> </Condition> <Perform> <SetVariable Name="$(Pattern)"> <StringConcat> <Value Culture="" Target="None" IsCDATA="True"><![CDATA[\b]]></Value> <Evaluate Target="None" Culture=""><![CDATA[/*/LongText/Keyword]]></Evaluate> <Value Culture="" Target="None" IsCDATA="True"><![CDATA[\b]]></Value> </StringConcat> </SetVariable> <SetVariable Name="$(Count)"> <Value Culture="" Target="Integer">0</Value> </SetVariable> <Regex Input="eval::/*/LongText/Source" Pattern="$(Pattern)" Replace="False" MatchVariable="Match"> <SetVariable Name="$(Count)"> <Math Operator="Add"> <Value Culture="" Target="Integer">1</Value> <Value Culture="" Target="Integer">$(Count)</Value> </Math> </SetVariable> </Regex> <Set Node="/*/LongText/Count"> <Value Culture="" Target="None">$(Count)</Value> </Set> </Perform> </Then> </If> </Script>
Şimdi kodumuzu adım adım açıklayalım.
İlk olarak bir If koşulu ile kaynak metninin ve arama kelimesinin dolu olup olmadığına bakıyoruz. Böylece kodumuz sadece gerekli alanlar dolu olduğunda çalışacaktır. Bu kontrolü koymazsak hem hata alabiliriz hem de gereksiz bir şekilde iş yükü oluşturmuş oluruz.
<If> <Then> <Condition> <And> <Not> <IsEmpty> <Evaluate Target="None" Culture=""><![CDATA[/*/LongText/Source]]></Evaluate> </IsEmpty> </Not> <Not> <IsEmpty> <Evaluate Target="None" Culture=""><![CDATA[/*/LongText/Keyword]]></Evaluate> </IsEmpty> </Not> </And> </Condition> <Perform> ... </Perform> </Then> </If>
Bilgi
Form Script içerisinden çalıştırılan kodlarda koşullu çalışmaya dikkat edilmelidir. Form her gönderildiğinde gereksiz kodlar çalışıp süreci yavaşlatabilir.
Pattern değişkeni içerisine Regex kural dizisini yazıyoruz. Bu örnekte basit bir kelime araması yapacağımız için "\b" + "aranacak kelime" + "\b" kuralını StringConcat fonksiyonu ile birleştirdik.
Regex
Regex kuralları ile ilgili detaylı bilgi için Wikipedia/Regex adresini ziyaret edebilirsiniz.
Regex örnekleriniz için de https://regex101.com/ adresini ziyaret edebilirsiniz.
<SetVariable Name="$(Pattern)"> <StringConcat> <Value Culture="" Target="None" IsCDATA="True"><![CDATA[\b]]></Value> <Evaluate Target="None" Culture=""><![CDATA[/*/LongText/Keyword]]></Evaluate> <Value Culture="" Target="None" IsCDATA="True"><![CDATA[\b]]></Value> </StringConcat> </SetVariable>
Sayımı yapmak için Count isminde bir değişken kullanıyoruz. Regex fonksiyonu bulduğu her kelime için bir döngü döndürecektir. Her döngüde değişkenimizin değerini 1 arttıracağız.
<SetVariable Name="$(Count)"> <Value Culture="" Target="Integer">0</Value> </SetVariable>
Son olarak aradığımız kelimenin kaynak metin içerisinde kaç adet geçtiğini hesaplayacağımız kodu yazıyoruz.
<Regex Input="eval::/*/LongText/Source" Pattern="$(Pattern)" Replace="False" MatchVariable="Match"> <SetVariable Name="$(Count)"> <Math Operator="Add"> <Value Culture="" Target="Integer">1</Value> <Value Culture="" Target="Integer">$(Count)</Value> </Math> </SetVariable> </Regex>
Hesapladığımız sayıyı /*/LongText/Count adresine yazdırıyoruz.
<Set Node="/*/LongText/Count"> <Value Culture="" Target="None">$(Count)</Value> </Set>
Bu örnek ile Regex ile yapabileceğiniz sınırsız senaryo olduğunu göstermeye çalıştık.
Ayrıca Bakınız