Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

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.

Image Added

Sürecin akış görünümü aşağıdaki gibidir.

Image Added

Form Verimiz aşağıdaki şekilde olacaktır.

Image Added

 

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.

 

Code Block
languagexml
titleArama Butonu
<input type="button" id="btnPostback" name="Ara" type="button" value="Ara" onclick="javascript:setTimeout('__doPostBack(\'btnPostback\',\'\')', 0)"></input>

 

Image Added

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.

Image Added

"RegexArama" metodumuzun içerisindeki kodumuz bu şekilde.

Code Block
languagexml
titleRegex Arama
linenumberstrue
<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. 

 

 

Code Block
languagexml
titleIf Koşulu
linenumberstrue
<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>
Info
titleBilgi

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.

Info
iconfalse
titleDikkat

Form Script'in her adımda çalıştığını unutmayın. Sadece bir adımda çalışacak bir kodunuz varsa tüm adımlarda gereksiz bir şekilde çalışmasını engelleyin.

 

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. 

Info
titleRegex

Regex kuralları ile ilgili detaylı bilgi için Wikipedia/Regex adresini ziyaret edebilirsiniz.

Regex örnekleriniz için de https://regex101.com/ adresini ziyaret edebilirsiniz.

Code Block
languagexml
titlePattern
linenumberstrue
 <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.

Code Block
languagexml
titleRegex Count
linenumberstrue
 <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.

Code Block
languagexml
titleRegex
linenumberstrue
  <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.

Code Block
languagexml
titleSet
linenumberstrue
 <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

Regex

SetVariable

Set

Value

StringConcat

If

Math Operations