Üye Kayıt Üye Giriş

VBScript Regular Expression Nesnesi


VBScript Regular Expression Nesnesi

 

VBScript Regular Expression Nesnesi

Önsöz :
Döküman kaynağı olarak 1. ek kaynaklar tercih edilmiştir. Bahsi geçen sınıf COM Browser ile incelenmiş ve sınıf içerisindeki elemanlar tek tek teste tabii tutulmuş ve olası sonuç ve kullanım şekillerine teker teker değinilmiştir. Bu yüzden bu kaynağın kapsadığı konuyu eksiksiz yansıttığını umuyorum. Doküman her zaman geri bildirime ve zaman içerisinde değişikliklere açıktır.

Tuğrul TOPUZ

Giriş :
Regular Expression, Türkçe ifadesi ile Düzenli İfadeler, betik dillerinde çok kabul görmüş bir yapıdır. Kullanım alanları olarak da kısaca, metin ifadelerin içerisinden metinden daha ufak ifadeleri ayırmak, metnin belli bir kalıba uygunluğunu kontrol etmek, metin üzerinde değişiklikler yapmak olduğunu söyleyebiliriz. Programcılık ile uğraşanların daha önce mutlaka duymuş olduğu Perl dili ise gücünün büyük bir kısmını Regular Expression'dan alır. Bu noktada Regular Expression yapısının dile bağlı olmadığını da görüyoruz. Regular Expression yapısına sahip dillere örnekler vermek gerekirse;

? Perl
? Python
? JavaScript
? JScript
? VBScript
? C#

Öneri :
Regular Expression'a kısaca "Regex" veya "RegExp" adı da verilir.

VBScript üzerinde kullandığımız Regex nesnesi ?VBScript.dll? ActiveX kütüphanesinde bulunur. Biz nesneyi devraldığımızda dolaylı olarak bu ActiveX kütüphanesi üzerinden yordamlar yürütülür. Şimdi de Regex nesnesini devralmayı öğrenelim;

?ornek_1.vbs
'-----
Dim oRegEx
Set oRegEx = New RegExp
'-----

aynı şekilde değişik ortamlar içersinde de kullanılabilir;

uyarı :
VBScript browser dili olarak yalnızca Internet Explorer üzerinde kullanılabilir.

<!--ornek_1.htm-->
<html>
<head>
<title>VBScript Regex</title>
</head>
<script language="VBScript" type="text/vbscript">
<!--
Dim oRegEx
Set oRegEx = New RegExp
'-->
</script>
<body>
</body>
</html>

<!--ornek_1.asp-->
<%@
Language=VBScript
%>
<%
Dim oRegEx
Set oRegEx = New RegExp
%>

Gördüğünüz gibi RegExp nesnesini VBScript nesnesinin kullanıldığı ortamların hepsinde kullanabiliyoruz. Fakat biz örneklerimizi VBS dosyaları üzerinden devam ettireceğiz. Çünkü VBS dosyaları kodlama ve uygulama açısında çok kolaylık sağladığı için bu formu tercih edeceğiz. Dileğinize göre VBS formunu diğer formlara uygun hale dönüştürebilirsiniz. Şimdi nesneyi devralmayı öğrendiğimize göre daha anlaşılır bir örnek yapalım;

?ornek_2.vbs
'-----
Const sCumle = "oyuncu Tuğrul, programcı Tuğrul"

Dim oRegEx
Set oRegEx = New RegExp

oRegEx.Pattern = "Tuğrul"

Dim oMatch,sSonuc
For Each oMatch In oRegEx.Execute(sCumle)
sMatch = _
"-----" & VbCrLf & _
"Bulunan değer: " & oMatch.Value & VbCrLf & _
"Değerin uzunluğu: " & oMatch.Length & VbCrLf & _
"Başlangıç sırası: " & oMatch.FirstIndex & VbCrLf & _
"-----"
WScript.Echo(sMatch)
Next


Set oRegEx = Nothing
'-----

Bu örnek ASCII formda VBS uzantısı ile kaydederek direkt çalışabilir hale gelmektedir. Dosya uzantısı Windows un yapılandırmasından ötürü yorumlayıcı program ile ilişkilidir. Dosyayı kaydetmişseniz direkt olarak çift tıklama ile çalıştırabilirsiniz. Çıktısı şu şekilde olacaktır:

çıktı:
-----
Bulunan değer: Tuğrul
Değerin uzunluğu: 6
Başlangıç sırası: 7
-----

Sonucu açıklığa kavuşturmak gerekirse "Bulunan değer" adlı kısım oRegEx.Pattern ile belirlediğimiz kalıp ile, içinde arama yaptığımız metin içerisinde doğrudan uyuşan kısımların, metin içerisinden ayrılıp bizim kullanımımıza sunulmuştur. Şimdi kafanıza şöyle bir soru takılacaktır. Kalıp ifade ile size sunulan değerin aynı olduğunu, bunun için bu tarz bir aracı ne amaç için kullanacağınız aklınızda soru işareti olacaktır. Kalıp ifadeler çoğu zaman net olarak tanımlanmazlar. Örnek olarak ".+@\..+" da kalıp ifadedir. Belirttiğimiz metinden mail adresi türündeki değerleri bize sunar. "Değerin uzunluğu" adlı kısım da "Bulunan değer" in karakter sayısını verir. Yani karakter sayısına ihtiyaç duyduğunuz zamanlarda sizi Len() fonksiyonunu kullanmak zorunda bırakmaz. İfade "Başlangıç sırası" ise "Bulunan değer" in ilk karakterinin metinin içerisinde kaçıncı karaktere denk geldiğini eder.

Şimdi önceden değinmediğimiz bir şeyden bahsetmenin vakti geldi. Aslında metin içerisinde kalıp ile uyuşan iki adet kelime mevcut. Fakat buna rağmen döngü bize 1 adet sonuç verdi. Bunun nedeni, nesneyi devraldığımızda kalıbın yalnızca bir ifade için geçerli olmasıdır. Bunu değiştirmek bizim elimizdedir. İlk devraldığımızda oRegEx.Global özelliği False değerine sahiptir. Şimdi sizi kandırdığımı nerden bileceksiniz .O zaman ispata gelelim;

?ornek_3.vbs
'-----
Dim oRegEx
Set oRegEx = New RegExp

WScript.Echo oRegEx.Global

Set oRegEx = Nothing
'-----

çıktı:
0

Veya,

çıktı:
False

Evet, gördüğünüz gibi ben haklı çıktım. Şimdi bu eklemeyi bir önceki programa ekleyip tekrar sonucunu gözlemleyelim;

?ornek_4.vbs
'-----
Const sCumle = "oyuncu Tuğrul, programcı Tuğrul"

Dim oRegEx
Set oRegEx = New RegExp

oRegEx.Pattern = "Tuğrul"
oRegEx.Global = True

Dim oMatch,sSonuc
For Each oMatch In oRegEx.Execute(sCumle)
sMatch = _
"-----" & VbCrLf & _
"Bulunan değer: " & oMatch.Value & VbCrLf & _
"Değerin uzunluğu: " & oMatch.Length & VbCrLf & _
"Başlangıç sırası: " & oMatch.FirstIndex & VbCrLf & _
"-----"
WScript.Echo(sMatch)
Next


Set oRegEx = Nothing
'-----

Çıktı:
-----
Bulunan değer: Tuğrul
Değerin uzunluğu: 6
Başlangıç sırası: 7
-----
-----
Bulunan değer: Tuğrul
Değerin uzunluğu: 6
Başlangıç sırası: 25
-----

Şimdi de zaman zaman ihtiyaç duyup da UCase() ve LCase() gibi fonksiyonları kullanarak ilkel yollardan çözmenin aklınıza geleceği bir özellikten daha bahsedeceğim. Bu özellik ise oRegEx.IgnoreCase özelliği. Bunun başlangıç değeri False dır. Görevi ise kalıp ile metini büyük küçük harf benzeşmesini gözetmeksizin yapmasıdır. Buna örnek verelim;

?ornek_5.vbs
'-----
Const sCumle = "oyuncu TuğruL, programcı tUĞRul"

Dim oRegEx
Set oRegEx = New RegExp

oRegEx.Pattern = "tuğrul"
oRegEx.Global = True
oRegEx.IgnoreCase = True

Dim oMatch,sSonuc
For Each oMatch In oRegEx.Execute(sCumle)
sMatch = _
"-----" & VbCrLf & _
"Bulunan değer: " & oMatch.Value & VbCrLf & _
"Değerin uzunluğu: " & oMatch.Length & VbCrLf & _
"Başlangıç sırası: " & oMatch.FirstIndex & VbCrLf & _
"-----"
WScript.Echo(sMatch)
Next


Set oRegEx = Nothing
'-----

çıktı:
-----
Bulunan değer: TuğruL
Değerin uzunluğu: 6
Başlangıç sırası: 7
-----
-----
Bulunan değer: tUĞRul
Değerin uzunluğu: 6
Başlangıç sırası: 25
-----

Dikkat çekeceği gibi metin ifadesinin içerisindeki ?Tuğrul? kelimesinde yerli yersiz büyük küçük harf dönüşümü yaptım. Örnek ilk anda yukarıdaki gibi sonuç verecektir. Bahsettiğimiz ifadede değişiklik yaparak sonuçtaki değişikliği görebilirsiniz.

Şimdi de baştan beri kullandığımız, fakat daha ne olduğundan bahsetmediğimiz bir şeyden bahsedeceğiz. Belirteceğimiz özellik oRegEx.Pattern. Bu özellik üzerinde işlem yapacağımız metin içerisinden ulaşmak istediğimiz kıstaslara uygun sonuçlar elde etmemizi sağlayan kalıbı tanımladığımız kısım. ?String? türünde değer alır ve geri döndürür. Her zaman baştan beri kullandığımız gibi net ifadeler kullanılmadığından daha önce bahsetmiştik. Şimdi de daha önce soyut olarak bahsettiğimiz mail örneğini soyutlaştıralım;

Kullanıcılar çoğu zaman hatalar yaparlar. Yanlış karakterler kullanırlar, yanlışlıkla boşluk ve yatay tab karakterleri kullanırlar, kimi zaman da bazı karakterleri unuturlar. Şimdi bu örnek için ASP ve HTML?i kullanabileceğimiz kanısındayım.

<!--ornek_2.htm-->
<html>
<head>
<title>e-mail listesi</title>
<script language="VBScript" type="text/vbscript">
<!--
Sub FormKontrol()
Dim oRegEx
Set oRegEx = New RegExp

oRegEx.Pattern = "^.+@.+\..+$"
oRegEx.Global = False
oRegEx.IgnoreCase = False

Dim oForm
Set oForm = document.forms(0)
If Not oRegEx.Test(oForm.item(0).value) Then
window.event.returnValue = False
Dim oUyari
Set oUyari=document.getElementById("uyari")
oUyari.innerHTML=_
"* Girilen adres geçersiz."
End If
End Sub
'-->
</script>
</head>
<body>
<form
action="ornek_2.asp"
method="POST"
onsubmit="FormKontrol()">
e-mail listemize abone olmak istermisiniz?<br>
<input
type="text"
name="f_email">
<div
id="uyari"
style="color:#FF0000">
</div><br>
<input
type="submit"
name="uyeol"
value="Üye Ol">
</form>
</body>
</html>

<!--ornek_2.asp-->
<%@
Language=VBScript
%>
<%
If UCase(Request.ServerVariables("REQUEST_METHOD")) = "GET" Then
Response.End()

Dim oRegEx
Set oRegEx = New RegExp

oRegEx.Pattern = "^.+@.+\..+$"
oRegEx.Global = False
oRegEx.IgnoreCase = True

If oRegEx.Test(Request.Form("f_email")) Then
Response.Write("e-mail listemize abone olduğunuz için teşekkür
ederiz.")
Else
Response.Write("hata: beklenmeyen form verisi")
End If
%>

Bu yaptığımız örnekte iki konuyu esas aldık.

1. Kullanıcının hata yaparak, yanlış veri göndermesi.
2. Kullanıcının kasıtlı amaçlar güderek yanlış veri göndermesi.

İlk olarak HTML'de yaptığımız kontrol mekanizması WEB programlama konusunda deneyimi olmayan, kişinin yanlış veri girdiği anda kişiyi uyararak doğru veri girmesi konusunda yönlendiriyor. ASP içerisindeki kontrol mekanizması ise normal şartlarda HTML'den gelebilecek teorik veriye göre faal(işler) gözükmüyor. Fakat zararlı bir kullanıcının, HTML temelli korumayı görüp balık gibi atladığını ve buna bağlı olarak kendi HTML kodunu oluşturup bizim ASP dosyamıza bununla kontrolsüz veri gönderme yeteneğine sahip olduğunu düşünürsek, böyle bir kontrolün ne kadar gerekli olduğunun önemini anlarız.

Şimdi ise bize kurulumdan sonra en çok fayda sağlayacak 3 adet fonksiyonu inceleyeceğiz;

? Test
? Replace
? Execute

Test Fonksiyonu
Biraz önce açıklamadan, e-mail kontrol örneğinde direkt olarak kullandığımız Test fonksiyonunun görevini ve nasıl kullanıldığını kısa bir tanımdan sonra inceleyeceğiz. Test fonksiyonumuz basitçe, parametre olarak gönderdiğimiz metin ifadenin kalıba uyup uymadığını kontrol eder ve "Boolean" türünde bize yanıt döndürür. Ufak bir örnek;

?ornek_6.vbs
'-----
Dim oRegEx
Set oRegEx = New RegExp

oRegEx.Pattern = "^a"
oRegEx.Global = True
oRegEx.IgnoreCase = True

Dim sBenimAdim
sBenimAdim = InputBox("Lütfen adınızı giriniz:","VBScript
Regex","Şevket")

Dim sSonuc
sSonuc = "Adınız ""A"" harfi ile "

If oRegEx.Test(sBenimAdim) Then
sSonuc = sSonuc & "başlıyor."
Else
sSonuc = sSonuc & "başlamıyor."
End If

WScript.Echo(sSonuc)

Set oRegEx = Nothing
'-----
Eğer varsayılan değer ile kodu çalıştırdığınızda sonuç aşağıdaki gibi olacaktır.

çıktı:
Adınız ?A? harfi ile başlamıyor.

Replace Fonksiyonu
Replace fonksiyonu görünüş olarak VBScript içerisindeki Replace fonksiyonunu andırmaktadır. Fakat bunda gözle görünmeyecek bir fark vardır. Bu farka biz "swap each pairs" adını veriyoruz. Kalıp ifade hazırlanırken kalıp ifade hazırlama karakterlerinde ( ve ) karakterleri ile oluşturulan yapılara pair adı verilir. Sonuç ifade içerisinden parça alıp taşıma gibi işlemlerde oldukça işimize yaramaktadır. Şimdi HTML kodunu basitçe BBCode'ye dönüştüren ufak bir örnek yapalım.



?ornek_7.vbs
'-----
Dim oRegEx
Set oRegEx = New RegExp

oRegEx.Pattern = "<(.+)>([^<>]+)</(.+)>"
oRegEx.Global = True
oRegEx.IgnoreCase = True

Dim sGelenVeri
sGelenVeri = InputBox( _
"Dönüştürülecek HTML kodunu giriniz:", _
"VBScript Regex", _
"<a href=""tihaha.htm"">tihaha anasayfa</a>")

Dim sSonuc
sSonuc = oRegEx.Replace(sGelenVeri,"[$1]$2[/$3]")

WScript.Echo(sSonuc)

Set oRegEx = Nothing
'-----

Varsayılan değer ile kodu çalıştırdığınızda sonuç aşağıdaki gibi olacaktır.

çıktı:
[a href=?tihaha.htm?]tihaha anasayfa[/a]

Execute Fonksiyonu
Bu fonksiyonu da ilk örneklerimizde kullanmıştık. Bana göre bu sınıfın en can alıcı fonksiyonu budur. Bu fonksiyon "Sting", "Integer" veya "Boolean" gibi saf bir değer döndürmemektedir. Fonksiyonun döndürdüğü değer türü "Object" dir. Yani başla bir sınıfın işaretçisidir. Sınıfı koleksiyon olarak geri döndürür. Koleksiyon dediğimizde aklımıza günlük hayattan örnekler gelebilir. Aslında bu örnekler ile doğrudan ilişkilidir. Koleksiyon dediğimizde aklımıza aynı cins ortak özelliklere sahip, belirli kıstaslara göre değişen nitelikler örneğin, bozuk para koleksiyonu, koleksiyondaki her para, anıldığı adı ile özleşen özelliklere sahiptir. Örneğin birisi bakır, birisi bronz birisi altın madeninden üretilmiş, Maddi değerleri farklı olan şeylerdir. Bu kadar teoriden sonra işi pratiğe dökelim;

?ornek_8.vbs
'-----
Dim oRegEx
Set oRegEx = New RegExp

oRegEx.Pattern = "<(.+)>([^<>]+)</(.+)>"
oRegEx.Global = True
oRegEx.IgnoreCase = True

Dim sGelenVeri
sGelenVeri = InputBox( _
"Dönüştürülecek HTML kodunu giriniz:", _
"VBScript Regex", _
"<a href=""tihaha.htm"">tihaha anasayfa</a>")

Dim oMatch,oSubMatch,sSonuc
For Each oMatch In oRegEx.Execute(sGelenVeri)
sSonuc = _
"-----" & VbCrLf & _
"Bulunan değer: " & oMatch.Value & VbCrLf & _
"Değerin uzunluğu: " & oMatch.Length & VbCrLf & _
"Başlangıç sırası: " & oMatch.FirstIndex & VbCrLf & VbCrLf & _
"Alt Değerler: " & VbCrLf
For Each oSubMatch In oMatch.SubMatches
sSonuc = sSonuc & " + " & oSubMatch & VbCrLf
Next
sSonuc = sSonuc & "-----"
Next

WScript.Echo sSonuc

Set oRegEx = Nothing
'-----

Varsayılan değer parametre olarak gönderildiğinde sonuç şekildeki gibi olacaktır.

çıktı:
-----
Bulunan değer: <a href="tihaha.htm">tihaha anasayfa</a>
Değerin uzunluğu: 40
Başlangıç sırası: 0


Alt Değerler:
+ a href="tihaha.htm"
+ tihaha anasayfa
+ a
-----


Daha önceden Match nesnesinin özelliklerine değindiğimiz için bunun üzerinde fazla durmadık ve bir önceki örnek üzerine ekleme yaparak SubMatches koleksiyonuna değineceğiz. Replace fonksiyonunda can alıcı nokta olarak gösterdiğimiz "swap each pairs" yine burada da canlar yakıyor. Örneğimizde kullandığımız SubMatches, Match nesnesi içerisinde bulunur ve kalıba oturan değerler arasındaki değişikliğe göre fark gösterir. Tam manası ile yaptığı iş, kalıp kodu içerisindeki pair ifadelerine, metin ifadelerinin oturan kısımlarını toplar ve ihtiyacımız olanını almamızı sağlar. Bu koleksiyon "Object" türünde değildir. "Variant" türünde saf türde bir veri döndürür. Visual Basic veya VBScript ile uğraşan kişiler bu veri türünün bu dillere özgü olduğunu bilirler. Özelliği ise içerisinde zaman içerisinde yeniden tanımlanmadan değişik veriler tutabilmektir. Tabiî ki böyle olması, bellek ile arasında derin tartışmalar yapmasına neden olur.

? Regular Expression, 5.5 sürümü itibari ile eksiksiz olarak anlatılmış ve örneklendirilmiştir.
? Bazı hakları yazar threedot a.k.a. Tuğrul TOPUZ adına saklıdır.

Referans Kaynak :
? Microsoft® Visual Basic® Scripting Edition Language Reference

Bilgisayar Dershanesi Ders Sahibi;
Bilgisayar Dershanesi

Yorumlar

Yorum Yapabilmek İçin Üye Girişi Yapmanız Gerekmektedir.

ETİKETLER

x