Düzenli İfadeler Ve Regexp Nesnesi

Düzenli ifadeler, karakter dizilerini karşılaştırmak, ayırmak/bölmek, sıralamak ve biçimlendirmek gibi işlemler için kullanılan kurallı stenografik sistemlerdir.
Düzenli İfadeler ve RegExp NesnesiDüzenli İfadeler ve RegExp Nesnesi
Bir RegExp (Regular Expression) nesnesi, bu gibi işlemler için kurallı bir ifadenin/deyimin kalıbını içererek karakter dizisi (string) içinde uygulanabilmesini sağlayan özelliklere ve metotlara sahiptir.
Düzenli ifade kalıplarında «<HTML>» etiketi veya «[email protected]» e-posta adresi ve benzeri birçok deyim için düzenli ifade kuralları tanımlayabilirsiniz. Örneğin «[email protected]» gibi bir e-posta adresinde temel olarak bir «@» (at/echo) işareti ve bir «.» (nokta) olmak zorundadır. Bu kuralı aşağıdaki gibi gösterebiliriz.
kelime1 @ kelime2 . kelime3
E-posta adresinin gösterimini basitçe tanımlayan bu kuralın düzenli ifadelerde stenografik gösterimi aşağıdaki gibi olacaktır.
1.Bir kelime = w+
2.Sonra @ işareti = @
3.Sonra bir kelime = w+
4.Sonra nokta = .
5.En son bir kelime = w+
Sonuç : /w+@w+.w+/
Ve daha bir çok kural tanımlayabilirsiniz.
•RegExp nesnesinin oluşturulması.
•Kalıp Bileşenleri: ◦Escape karakterler
◦Karakter Türleri
◦Sınır eşleşmeleri
◦Yineleme miktarları
•Fonksiyonlar ve Parametreler
RegExp nesnesinin oluşturulması
Düzenli ifadeleri RegExp nesnesinin kurucu fonksiyonuyla veya stenografik gösterim ile aşağıdaki gibi tanımlayabilirsiniz.
Stenografik gösterimi:
/kalip/ayarlar
Kurucu fonksiyon ile:
new RegExp(“kalip” [,”ayarlar”] )
•kalip : Düzenli ifade metni. (Steno gösterim)
•ayarlar : Eğer belirtildiyse aşağıdakilerden biri veya birkaçı ◦g : Global kontrol.
◦i : Büyük-küçük harf uyumunu atlar.
◦m : Metnin birden çok satıra sahip olduğunu ifade eder.
Stenografik gösterimde, karakter dizilerini belirtmek için tırnak işaretlerinin kullanılmadığına dikkat edin, tırnak işaretleri sadece kurucu fonksiyonda kullanılır. Aşağıdaki ifadelerin ikiside aynı düzenli ifade kurallarını tanımlar.
1. /ab+c/i
2. new RegExp(“ab+c”, “i”)
RegExp kurucu fonksiyon kullanılacağı zaman standart escape karakter kurallarına uyulması zorunludur. Örneğin, aşağıdaki gösterimlerin ikiside aynı kuralları tanımlar.
1. re = new RegExp(“w+”)
2. re = /w+/
Escape Karakterler
Escape Karakterler sadece düzenli ifadelerde değil bir çok programlama lisanında da özel anlama sahip olan ve genelde görüntülenemeyen karakterleri temsil etmek için kullanılırlar.
Özellikle unutulmaması gereken bir kural ” ters bölü (backslash) karakterinin Escape karakterlerde özel bir anlamı olduğudur. ” özel karakteri bir çok karakterin özel olup-olmadığını belirler. Örneğin ” ifadesi özel anlamı olmayan ” ters bölü anlamına gelir veya düzenli ifadelerde özel bir anlama sahip ‘/’ bölü özel karakterini ‘/’ şeklinde gösterebilirsiniz.
RegExp nesnesi le kullanabileceğiniz escape karakterleri aşağıdaki tabloda gösterilmiştir.
Karakter
Anlamı
f FormFeed (FF)
n Yeni Satır (LF – LineFeed)
r Satırbaşı (CR – Carriage return)
t Tab (HT)
v Dikey Tab (VT)
Karakter
Anlamı
xhh Onaltılık iki basamaklı ‘hh’ ile belirtilen karaktere denktir.
uhhhh Onaltılık dört basamaklı ‘hhhh’ ile belirtilen unicode karaktere denktir.
cX ‘X’ yerine A-Z arası bir değer alarak “Control” karakteri tanımlar.
Karakter Türleri
Özel karakterler, düzenli ifadeleri oluştururken ifadeleri kısaltarak stenografik gösterim için kullanılırlar. Örneğin “w” özel karakteri altçizgi dahil herhangi bir alfanümerik karaktere denktir. (_a-zA-Z0-9)
Karakter
Anlamı
d 0-9 rakamlardan biri
D Rakam olmayan bir karakter
s Herhangi bir boşluk karakteri
S Boşluk olmayan bir karakter
w Alt çizgi, rakamlar ve harflerden biri
W Alt çizgi, rakam ve harf olmayan bir karakter
Karakter
Anlamı
. nokta n (yeni satır) hariç herhangi bir karakter
[abcd] abcd karakterlerinden biri
[^abcd] abcd’den biri olmayan bir karakter
[a-e] a-e arası bir karakter
x|y x veya y’den biri
() , gibi değerlerle daha sonra kullanmak için içindekileri saklar.
Sınır Eşleşmeleri
Sınır eşleşmeleri özel karakterleri, düzenli ifadelerde bir karakter dizisi içinde bir kelime veya bir bölümün başlangıcı veya sonu gibi değerlerinin tanımlanmasını sağlar.
Karakter
Anlamı
^ Karakter dizisi başlangıcı
$ Karakter dizisi sonu
b Kelime sınırı
B Kelime sınırı olmayan bir konum
Yineleme miktarları
Yineleme miktarı özel karakterleri, düzenli ifadelerde kendinden önce gelen özel karakterin veya ifadenin kaç defa tekrarlanacağını/tekrarlanma ihtimalini tanımlarlar.
Karakter
Anlamı
* ‘0’ sıfır veya daha fazla
+ 1 veya daha fazla
? ‘0’ sıfır veya 1 kere
{x} Tam ‘x’ kere
{x,} En az ‘x’ kere
{x,y} En az ‘x’ en fazla ‘y’ kere
Fonksiyonlar ve Parametreler
Parametreler
RegExp nesnesinin özelliklerinin birkaçı kısa ve uzun isimlere sahiptir. Her iki isimde daima aynı değeri gösterir.
Özellik
Açıklama
global Karakter dizisinin tamamının kontrol edilip-edilmeyeceği.
ignoreCase Harf hassasiyetinin olup olmadığı
multiline Karakter dizisinin çok satırlı olup-olmadığı.
Fonksiyonlar
Metod
Açıklama
exec Aldığı karakter dizisi parametresi içinde eşleşmeyi uygular.
test Aldığı karakter dizisi parametresini eşleşme için test eder.
Düzenli ifadelerde + karakteri ve kullanım örneği
JavaScript RegExp + özel karakteri, kendinden önce gelen ifadenin en az 1 veya daha fazla defa tekrarlanacağını ifade eder. {1,} ifadesi ile aynı anlama gelir.
Aşağıdaki örnek + karakteri ile kullanılan bir harfin karakter dizisi içinde kullanılmaması veya kullanılması durumlarının sonuçlarını göstermektedir.
<script type=”text/javascript”>
Duzenli = /No+/;
Sonuc1 = Duzenli.exec(“myNoootlar.com”);
Sonuc2 = Duzenli.exec(“myNotlar.com”);
Sonuc3 = Duzenli.exec(“myNtlar.com”);
document.write(Sonuc1 + “<br/>”);
document.write(Sonuc2 + “<br/>”);
document.write(Sonuc3 + “<br/>”);
</script>
Sonuç
Nooo
No
null
Düzenli ifadelerde nokta karakteri ve kullanım örneği
JavaScript RegExp . (Nokta) özel karakteri, ‘n’ (yeni satır – new line) karakteri hariç herhangi bir karakter yerine kullanılabilir. Doğal olarak ‘.’ özel karakteri ‘.’ karakteri yerine de kullanılabilir. Eğer oluşturacağınız düzenli ifadede ‘.’ nokta karakterinin özel bir anlamı varsa sadece ‘.’ nokta karakterine denk olan ‘.’ ifadesini kullanabilirsiniz.
Aşağıdaki örnek ‘.’ özel karakterinin kullanılmasını göstermektedir.
<script type=”text/javascript”>
Duzenli = /m.N.tl.r.c.m/;
Sonuc1 = Duzenli.exec(“myNoootlar.com”);
Sonuc2 = Duzenli.exec(“myNotlar.com”);
Sonuc3 = Duzenli.exec(“myNtlar.com”);
document.write(Sonuc1 + “<br/>”);
document.write(Sonuc2 + “<br/>”);
document.write(Sonuc3 + “<br/>”);
</script>
Sonuç
null
myNotlar.com
null
Düzenli ifadelerde özel karakterlerin kullanımı
RegExp – Ters Bölü (Backslash) özel karakteri kendinden sonra gelen karakterin özel olduğunu veya olmadığını ifade eder. Örneğin, düzenli ifadelerde ‘*’ karakterinin özel bir anlamı olmasına karşın ‘*’ ifadesi sadece ‘*’ karakterini temsil eder.
Bu kural kendisi içinde geçerlidir. C ve C++ lisanlarının türevi programlama lisanlarında olduğu gibi ters bölü yazmak için ” gibi iki tane ters bölü kullanılır.
Aşağıdaki örnek düzenli ifadelerde özel bir anlama sahip olan ‘*’ (yıldız) karakterinin ” ile kullanımını göstermektedir.
<script type=”text/javascript”>
Duzenli = /.*/;
document.write(Duzenli.exec(“myNotlar.com Türkçe JavaScript kaynağıdır!*”));
Duzenli = /.*/;
document.write(Duzenli.exec(“myNotlar.com Türkçe JavaScript kaynağıdır!*”));
</script>
Sonuç
myNotlar.com Türkçe JavaScript kaynağıdır!*
!*
Açıklama
.* : Nokta herhangi bir karakteri temsil eder. * ise kendinden önceki ifadenin (nokta) sıfır veya daha çok kere tekrarlanmasını sağlar ki bu da cümlenin tamamını ifade eder.
.* : * ifadesi yalnızca * karakterini temsil eder. Buna göre bu ifade kendinden sonra * gelen herhangi bir karakteri dizisini temsil eder.
Düzenli ifadelerde soru işareti karakteri ve kullanım örneği
JavaScript RegExp ? özel karakteri, kendinden önce gelen ifadenin 0 veya 1 defa tekrarlanacağını ifade eder. Eğer miktar belirleyen *, +, ?, veya {} ifadelerinden herhangi birinden sonra kullanılırsa, tekrarlamanın minimum sayısına göre eşleşme yapılır.
Aşağıdaki örnek ? karakteri ile kullanılan bir harfin karakter dizisi içinde kullanılmaması veya kullanılması durumlarının sonuçlarını göstermektedir.
<script type=”text/javascript”>
Duzenli = /No?/;
Sonuc1 = Duzenli.exec(“myNoootlar.com”);
Sonuc2 = Duzenli.exec(“myNotlar.com”);
Sonuc3 = Duzenli.exec(“myNtlar.com”);
document.write(Sonuc1 + “<br/>”);
document.write(Sonuc2 + “<br/>”);
document.write(Sonuc3 + “<br/>”);
</script>
Sonuç
No
No
N
Açıklama
/No?/ ifadesi, ‘N’ harfi olmalı ve yanında ‘o’ harfi kullanılsa da kullanılmasa da olur anlamına gelmektedir. Buna göre Sonuc1 ‘No’, Sonuc2 ‘No’ ve Sonuc3 ‘o’ harfi hiç kullanılmadığı için ‘N’ olacaktır.
Aşağıdaki örnek, ? özel karakterinin * özel karakteri ile kullanımını göstermektedir.
<script type=”text/javascript”>
Duzenli = /No*?/;
Sonuc1 = Duzenli.exec(“myNoootlar.com”);
Sonuc2 = Duzenli.exec(“myNotlar.com”);
Sonuc3 = Duzenli.exec(“myNtlar.com”);
document.write(Sonuc1 + “<br/>”);
document.write(Sonuc2 + “<br/>”);
document.write(Sonuc3 + “<br/>”);
</script>
Sonuç
N
N
N
Açıklama
/No*?/ ifadesi, ‘N’ harfi olmalı ve yanında ‘o’ harfi ise * karakteri kullanıldığı için ‘0’ sıfır veya daha çok defa kullanılmalı anlamına gelmektedir. Fakat ? karakteri, * karakterinin minimum değerini kullanmaya zorlar. * karakterinin minimum değeri ‘0’ olduğu için bu ifade sadece ‘N’ karakterine denktir. Buna göre Sonuc1, Sonuc2 ve Sonuc3 ‘N’ olacaktır.
Canlı Sonuç /No+?/ için. (‘+’ : 1 veya daha fazla)
No
No
null
Düzenli ifadelerde string başlangıç kontrolü
JavaScript RegExp ^ özel karakteri, girilen karakter dizisinin başlangıcını ifade eder. Eğer düzenli ifadede ‘m’ parametresi kullanıldıysa ve giriş birden çok satırdan oluşuyorsa diğer satırlarda eşleşme için kontrol edilir.
Aşağıdaki örnek karakter dizisi başlangıcında olması beklenen bir kelimenin nasıl kontrol edileceğini göstermektedir.
<script type=”text/javascript”>
Duzenli = /^myNotlar/;
Sonuc1 = Duzenli.exec(“myNotlar.com Türkçe JavaScript kaynağıdır!”);
Sonuc2 = Duzenli.exec(“Türkçe JavaScript kaynağı = myNotlar.com”);
document.write(Sonuc1 + “<br/>”);
document.write(Sonuc2 + “<br/>”);
</script>
Sonuç
myNotlar
null
Açıklama
/^myNotlar/ ifadesi, kendinden sonra ne olursa olsun girilen karakter dizisinin başlangıcının ‘myNotlar’ olması gerektiğini ifade eder. Girilen ilk cümle bu kurala uyduğu için Sonuc1 ‘myNotlar’, ikinci cümle uymadığı için Sonuç2 ‘null’ döner.
Düzenli ifadelerde string sonu kontrolü
JavaScript RegExp $ özel karakteri, girilen karakter dizisinin sonunu ifade eder. Eğer düzenli ifadede ‘m’ parametresi kullanıldıysa ve giriş birden çok satırdan oluşuyorsa diğer satırlarda eşleşme için kontrol edilir.
Aşağıdaki örnek karakter dizisinin belli bir kelime ile bitip-bitmediğinin nasıl kontrol edileceğini göstermektedir.
<script type=”text/javascript”>
Duzenli = /kaynağıdır!$/;
Sonuc1 = Duzenli.exec(“myNotlar.com Türkçe JavaScript kaynağıdır!”);
Sonuc2 = Duzenli.exec(“Türkçe JavaScript kaynağı = myNotlar.com”);
document.write(Sonuc1 + “<br/>”);
document.write(Sonuc2 + “<br/>”);
</script>
Sonuç
kaynağıdır!
null
Açıklama
/kaynağıdır!$/ ifadesi, kendinden önce ne olursa olsun girilen karakter dizisinin ‘kaynağıdır!’ ile bitmesi gerektiğini ifade eder. Girilen ilk cümle bu kurala uyduğu için Sonuc1 ‘kaynağıdır!’, ikinci cümle uymadığı için Sonuc2 ‘null’ döner.
Düzenli ifadelerde yıldız karakteri ve kullanım örneği
JavaScript RegExp * özel karakteri, kendinden önce gelen ifadenin ‘0’ sıfır veya daha fazla defa tekrarlanacağını ifade eder.
Aşağıdaki örnek * karakteri ile kullanılan bir harfin karakter dizisi içinde kullanılmaması veya kullanılması durumlarının sonuçlarını göstermektedir.
<script type=”text/javascript”>
Duzenli = /No*/;
Sonuc1 = Duzenli.exec(“myNoootlar.com”);
Sonuc2 = Duzenli.exec(“myNotlar.com”);
Sonuc3 = Duzenli.exec(“myNtlar.com”);
document.write(Sonuc1 + “<br/>”);
document.write(Sonuc2 + “<br/>”);
document.write(Sonuc3 + “<br/>”);
</script>
Sonuç
Nooo
No
N
Açıklama
/No*/ ifadesi, ‘N’ harfi olmalı, ‘o’ harfi ise olmasada olur, fakat varsa bir çok defa kullanılmış olabilir anlamına gelmektedir. Buna göre Sonuc1 ‘Nooo’, Sonuc2 ‘No’ ve Sonuc3 ‘o’ harfi hiç kullanılmadığı için ‘N’ olacaktır.
RegExp.exec
JavaScript RegExp.exec metodu, aldığı karakter dizisi parametresi içinde eşleşme için aramayı gerçekleştirerek sonucu bir Array sonuç dizisi olarak döndürür.
Sözdizimi
regexp.exec([kelime])
* regexp : Düzenli ifadenin adı. Bir değişken adı veya steno gösterim.
* kelime : Düzenli ifade eşleşmesinin kontrol edileceği karakter dizisi.
Açıklama
RegExp.exec metodu sonucunda eğer eşleşme başarılı olursa exec metodu bir Array sonuç dizisi döndürür ve düzenli ifade nesnesini günceller. Eğer eşleşme başarısız olursa null döndürür. Dönen Array dizisindeki [0] değeri en son yapılan eşleşmeye, [1]..[n] arası ise düzenli ifadedeki parantezlerin içeriklerine denktir.
Eğer “var” veya “yok” (true/false) gibi basit bir eşleşme kontrolü yapacaksanız bu metod yerine test metodunu veya String nesnesinin search metodunu kullanmanız performans açısından size fayda sağlayacaktır.
Aşağıdaki örnek exec metodu sonunda dönen Array dizisinin kullanımını göstermektedir.
<script type=”text/javascript”>
var Duzenli =/(my+)w+(notlar+)/ig;
var Kelime = “gdrrdrmarsggdsmylkNotlardgfg”;
var Sonuc = Duzenli.exec(Kelime);
document.write(Sonuc[0] + “<br/>” );
document.write(Sonuc[1] + “<br/>” );
document.write(Sonuc[2] + “<br/>” );
document.write(Sonuc[1] + Sonuc[2] +”<br/>” );
</script>
Sonuç
Sonuc[0] : mylkNotlar
Sonuc[1] : my
Sonuc[2] : Notlar
myNotlar
Açıklama
/(my+)w+(notlar+)/ig ifadesinin ilk parantezindeki (my+) ifadesi, ‘m’ harfi olmalı ve yanında ‘y’ harfi en 1 kere kullanılmalı, sonraki w+ ifadesi 1’den fazla alfanumerik karakter olmalı ve ikinci parantezdeki (notlar+) ifadesi ise ‘notla’ olmalı ve yanında ‘r’ harfi en az 1 kere kullanılmalı anlamlarına gelmektedir.
Düzenli ifadede kullanılan parantezler, içlerindeki eşleşme sonuçlarının Array dizisine ekleneceğini ifade etmektedir. Fakat, Array dizisinin ilk değeri olan [0] her zaman eşleşme değerini tutar. Buna göre, Sonuc[0] ‘mylkNotlar’, Sonuc[1] ‘my’ ve Sonuc[2] ‘Notlar’ olacaktır.
Eğer parantezleri kullanmazsak Array dizisinin içeriği aşağıdaki gibi olacaktır.
Sonuc[0] : mylkNotlar
Sonuc[1] : undefined
Sonuc[2] : undefined
NaN
RegExp.test
JavaScript RegExp.test metodu, aldığı karakter dizisi parametresi içinde sadece eşleşme olup-olmadığını kontrol eder ve olumlu olması durumunda ‘true’, olumsuz olması durumunda ‘false’ döndürür.
Sözdizimi
regexp.test([kelime])
* regexp : Düzenli ifadenin adı. Bir değişken adı veya steno gösterim.
* kelime : Düzenli ifade eşleşmesinin kontrol edileceği karakter dizisi.
Açıklama
Eğer karakter dizisi içinde “var” veya “yok” (true/false) gibi basit bir eşleşme kontrolü yapacaksanız bu metot exec metoduna göre daha uygundur. exec metodunu bir döngü içinde kullanacaksanız döngü boyu ile orantılı olarak script performansını düşürecektir.
Aşağıdaki örnek girilen bir e-posta adresinin geçerliliğinin nasıl kontrol edileceğini göstermektedir.
<script type=”text/javascript”>
function EpostaKontrol()
{
var DuzenliEposta = /^[w.-]{3,}@[w-]{3,}.[a-zA-Z]{2,3}(.w{2})?$/;
var Giris = prompt(“Lütfen e-posta adresi giriniz.”);
if(DuzenliEposta.test(Giris))
alert(“E-posta adresi geçerli!”);
else
alert(“Girişiniz geçerli bir e-posta adresi değil!”);
}
</script>
<input type=”button” value=”Göster!” onClick=”EpostaKontrol()” />
Kodlar içinden HTML kodlarını seçmek
/<script[sS]*?</script>/gi
<TAGb[^>]*>(.*?)</TAG> Analyze this regular expression with RegexBuddy matches the opening and closing pair of a specific HTML tag. Anything between the tags is captured into the first backreference. The question mark in the regex makes the star lazy, to make sure it stops before the first closing tag rather than before the last, like a greedy star would do. This regex will not properly match tags nested inside themselves, like in <TAG>one<TAG>two</TAG>one</TAG>.
<([A-Z][A-Z0-9]*)b[^>]*>(.*?)</1> Analyze this regular expression with RegexBuddy will match the opening and closing pair of any HTML tag. Be sure to turn off case sensitivity. The key in this solution is the use of the backreference 1 in the regex. Anything between the tags is captured into the second backreference. This solution will also not match tags nested in themselves.
Boşlukları Temizlemek
You can easily trim unnecessary whitespace from the start and the end of a string or the lines in a text file by doing a regex search-and-replace. Search for ^[ t]+ Analyze this regular expression with RegexBuddy and replace with nothing to delete leading whitespace (spaces and tabs). Search for [ t]+$ Analyze this regular expression with RegexBuddy to trim trailing whitespace. Do both by combining the regular expressions into ^[ t]+|[ t]+$ Analyze this regular expression with RegexBuddy. Instead of [ t] which matches a space or a tab, you can expand the character class into [ trn] if you also want to strip line breaks. Or you can use the shorthand s instead.
IP Adreslerini Almak
Matching an IP address is another good example of a trade-off between regex complexity and exactness. bd{1,3}.d{1,3}.d{1,3}.d{1,3}b will match any IP address just fine, but will also match 999.999.999.999 as if it were a valid IP address. Whether this is a problem depends on the files or data you intend to apply the regex to. To restrict all 4 numbers in the IP address to 0..255, you can use this complex beast: b(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?).(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?).(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?).(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)b Analyze this regular expression with RegexBuddy (everything on a single line). The long regex stores each of the 4 numbers of the IP address into a capturing group. You can use these groups to further process the IP number.
If you don’t need access to the individual numbers, you can shorten the regex with a quantifier to: b(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?).){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)b Analyze this regular expression with RegexBuddy. Similarly, you can shorten the quick regex to b(?:d{1,3}.){3}d{1,3}b Analyze this regular expression with RegexBuddy
Kaynak www.mynotlar.com/javascript/referans/regexp/duzenli_fadeler_ve_regexp_nesnesi.aspx , www.regular-expressions.info/examples.html