JavaScript Temelleri

Bölüm 9

String (Karakter Dizgisi) Nesne Sınıfı

Bölüm 9 Sayfa 2

9.2.7 - String (Karakter Dizgisi) Nesne Sınıfı Prototipinin indexOf() Metodu

Bu metod, bir kd nesne örneğinde, belirli alt kd verisinin ilk karakterinin, incelenen kd içinde belirli bir konumdan sonra rastlandığı ilk konumu döndürür. Böyle bir uyuşmaya rastlanmazsa, -1 döndürülür. Eğer arama konumu belirsiz veya belirtilmemişse arama incelenen kd nesne örneğinin ilk karakterinden başlanarak yürütülür. Bu metodun kullanım şekli aşağıda görülmektedir :

KarakterDizgisiSınıfıNesneÖrneği.indexOf('Alt KD', [konum]);
		

Bu konuda bir JavaScript programı ve bağlantılı olduğu uygulama sayfasında verdiği sonuç, aşağıda görülmektedir:

...
var veri = new String('Atatürk Bulvarı');
sonuçYaz('İlk Konum = ', veri.indexOf('Bulvarı'), 'b9.2.7-uyg-1-sonuç-1');
...
		

Program Sonucu :

Program sonucundan görüldüğü gibi, uyuşma konum 8 deki 9 uncu karakterden başlamaktadır. Bu metodu kısaca ilkKonum metodu olarak adlandırabiliriz.

9.2.8 - String (Karakter Dizgisi) Nesne Sınıfı Prototipinin LastIndexOf() Metodu

Bu metod, bir kd nesne örneğinde, belirli alt kd verisinin ilk karakterinin, incelenen kd içinde belirli bir konumdan sonra rastlandığı ilk konumu döndürür. Böyle bir uyuşmaya rastlanmazsa, -1 döndürülür. Eğer arama konumu belirsiz veya belirtilmemişse arama incelenen kd nesne örneğinin ilk karakterinden başlanarak yürütülür. Bu metodun kullanım şekli aşağıda görülmektedir :

KarakterDizgisiSınıfıNesneÖrneği.LastIndexOf('Alt KD', [konum]);
		

Bu konuda bir JavaScript programı ve bağlantılı olduğu uygulama sayfasında verdiği sonuç, aşağıda görülmektedir:

...
var veri = new String('Atatürk Bulvarı');
sonuçYaz('Son Konum = ', veri.lastIndexOf('a'), 'b9.2.8-uyg-1-sonuç-1');
...
		

Program Sonucu :

Program sonucundan görüldüğü gibi, en son uyuşma konum 12 deki 13 üncü karakterde sona ermektedir. Bu metodu kısaca sonKonum metodu olarak adlandırabiliriz.

9.2.9 - String (Karakter Dizgisi) Nesne Sınıfı Prototipinin localeCompare() Metodu

Bu metodun amacı iki kd verisinin karşılaştırılmasıdır. Metodun kullanımı

KarakterDizgisiSınıfıNesneÖrneği.localCompare("Karşılaştırılacak KD verisi");
		

şeklindedir.

localCompare() Metodu, önce her iki kd nesne sınıfı örneğini ve karşılaştırılaracak kd değerini, ilkel kd tipine dönüştürür ve her iki kd verisini, varsayılan yerel değerlere karşılaştırır. Spesifikasyon sadece her iki kd verisinin Unicode değerlerinin kanonik olarak birbirine eşitse 0 veya -0, her iki kd verisinin sıralanmasına göre karşılaştırılacak kd sıralamada daha aşıda ise negatif, yukarıda ise pozitif bir değer döndürüleceğini belirtir. Çoğu belge çözümleyiciler, -1, 0, 1 değerlerini döndürürler.

Bu metodun yazılımı, JavaScript yorumlayıcısının yazılımına bağlıdır. Genellikle, sözel verilerin karşılaştırılmaları risklidir ve kullanıcılar aynı sözel ifadeyi amaçlamalarına karşın, yazım farklarından aynı değeri tutturamazlar. Bu konuda, daha önce de belirttiğimiz gibi, programlarda önlemler alınması gerekir.

Bu konuda bir JavaScript programı ve bağlantılı olduğu uygulama sayfasında verdiği sonuç, aşağıda görülmektedir:

...
var veri = new String('Atatürk Bulvarı'), sonuç  = veri.localCompare('Atatürk Bulvarı');

if (sonuç === 0) {
sonuç = 'Tam Uyuşma Sağlandı !';
}
else {
sonuç = 'Tam Uyuşma Yok !';
}
sonuçYaz('Sonuç = ', sonuç, 'b9.2.9-uyg-1-sonuç-1');
...
		

Program Sonucu :

9.2.10 - String (Karakter Dizgisi) Nesne Sınıfı Prototipinin match() Metodu

Not : Bu metodu, ek2 de açıklanan düzenli deyimler (regular expressions) (regexp) üzerinde bilgilenmeden ve RegExp nesnesini incelemeden okumayınız !

Bu metodun uygulanması,

this.match(regexp); 
		

şeklindedir. Burada this bir kd sınıfı, regexp bir RegExp sınıfı nesne örneğidir.

Bu metodun argümanı bir RegExp sınıfı nesne örneği deil de bir kd literali ise, metot, ilk olarak bu kd verisini bir RegExp sınıfı yapılandırıcının argümanı olarak kullanrak yeni bir RegExp sınıfı nesne örneği oluşturur. Bu işlem,

new RegExp(regexp);
		

şeklindedir. Bu durumda, kullanıcının beslediği kd verisinden oluşturulacak RegExp sınıfı nesne örneği sonucunu önceden iyi bilmesi gerekir. Normal olarak, bu metodun argümanı olarak önceden oluşturulmuş RegExp literalleri, yani düzenli deyim desenleri kullanılmalıdır.

Bu metot geriye bir dizi döndürecektir. Bu dizinin içeriği, metodun argümanı olan düzenli deyim ifadesinde, g durum değiştiricisinin belirtilmiş olup olmamasına bağlıdır.

Eğer global arama öngörülmemişse, metot geriye,

regexp.exec(this)
		

ifadesi ile aynı sonucu döndürür.

Eğer global arama öngörülmüşse, regexp.LastIndex özelliği 0 ´a eşitlenir ve artık hiç uyuşma olmayıncaya kadar regexp.exec(this) metodu çağrılır. Eğer boş bir kd ile uyuşma olursa regexp.LastIndex özelliğinin değeri 1 arttırılarak devam edilir. eğer n uyuşma sayısı ise, geri döndürülecek dizinin elemanları 0 dan başlanarak uyuşma sağlanan regexp.exec(this) çağrılarının geriye döndürülen ilk elemanlarıdır. Uyuşma olmazsa, null değeri döndürülür.

Bu metodun geri döndüreceği sonucun ilk bakışta öngörülmesi kolay değildir. Geri döndürülecek sonucun denendikten sonra kullanılması uygun olacaktır.

Bu metodun ilk bir uygulama programı, ve ilişkili olduğu sayfada verdiği sonuç aşağıda görülmektedir:

...

var kd = 'JavaScript', sonuç = null;

sonuç= kd.match('(Java)*(Script)','i');
			
if (sonuç !== null) {
sonuçYaz('Sonuç : ', sonuç, 'b9.2.10-uyg-1-sonuç-1');
}

else{
bilgiYaz('Uyuşma Sağlanamadı !',  'b9.2.10-uyg-1-sonuç-1');
}

...
		

Program Sonucu :

Yukarıdaki programda match() metodunun argümanı bir kd literali olarak verilmiştir. Oysa ki bu argümanın bir düzenli deyim literali olması gerekirdi. Bu durumda, match() metodu, argümanını, kd tipinden regexp (düzenli deyim) tipine dönüştürecektir. Dönüştürme için, match() metodu, önce düzenli deyim nesne sınıfı yapılandırıcını çağrırır ve argümanı olarak kendi argümanını kullanarak,aşağıda görüldüğü gibi, yeni bir düzenli deyim nesne sınıfı örneği yaratır.

düzenliDeyim = new Regexp('(Java)*(Script)','i');
		

Sonra, oluşturulmuş olan bu düzenli deyim nesne sınıf örneğini, aşağıda görüldüğü gibi, ilkel kd tipi bir veriye dönüştürür ve yine ilkel kd verisine dönüştürdüğü this verisi ile uyuşmasını sınar ve sınama sonucunu döndürür. Bu durumda, yukarıdaki program, aşağıda görüldüğü gibi de yazılabilir:

...

var düzenliDeyim = new RegExp('(Java)*(Script)','i'), kd = 'JavaScript', sonuç = null;

sonuç= kd.match(düzenliDeyim);
			
if (sonuç !== null) {
sonuçYaz('Sonuç : ', sonuç, 'b9.2.10-uyg-1-sonuç-1');
}

else{
bilgiYaz('Uyuşma Sağlanamadı !',  'b9.2.10-uyg-1-sonuç-1');
}

...
		

Burada,

var düzenliDeyim = new RegExp('(Java)*(Script)','i');
		

işleminin sonucunda oluşacak düzenliDeyim adlı regexp nesne sınıf örneğinin içeriği, /(Java)*(Script)/i dir. Okunabilirliği en yüksek olacak bir programda, match() metodunun argümanı olarak bu içerikte bir kd literalinin verilmesi en doğru yöntem olacaktır. Yukarıdaki program en basit olarak aşağıdaki gibi yazılabilir:

...

var kd = 'JavaScript', sonuç = null;

sonuç= kd.match(/(Java)*(Script)/i);
			
if (sonuç !== null) {
sonuçYaz('Sonuç : ', sonuç, 'b9.2.10-uyg-1-sonuç-1');
}

else{
bilgiYaz('Uyuşma Sağlanamadı !',  'b9.2.10-uyg-1-sonuç-1');
}

...
		

Yukarıdaki programda match() metodunun argümanı olan düzenli deyimde global arama anahtarı kapalı ve sadece küçük/büyük karakter seçimi anahtarı açık durumdadır. Bu nedenle arama, this verisindeki tüm olası uyuşmalar tamamlanıncaya kadar tekrarlanacaktır. Düzenli deyim ifadesinde iki alt sınıf bulunmaktadır. Bu durumda, kd verisinde global uyuşma, birinci alt sınıfın uyuşması, ikinci alt sınıfın uyuşması üç uyuşma savı (assertion) sınanacak ve içlerinden birisi bile gerçekleşirse, her üçünün sonucu geri döndürülecek dizinin elemanları olarak atanacaktır.

Burada düzenli deyim '/(Java)*(Script)/i' şeklindedir ve 'JavaScript', 'javascript', 'JAvaScript', gibi kd değerlerine, son örneği ele alırsak, 'JavaScript', 'JAva','Script' şeklinde elemanları geri döndürecektir. Esas ilginç sonuç, aynı düzenli deyimle, 'script' kd verisinin karşılaştırılması sırasında karşılaşılmakta ve burada 'script', '', 'script', elemanları geri döndürülmektedir. Geri döndürülen dizideki elemanların ilki global yani toplam karşılaştırma sonucudur. İkinci eleman ise bir boş dizidir. Boş dizi olmasının nedeni ikinci alt sınıf olan '(Java)' yerine, bir boş sınıfla karşılaşılmış olmasıdır. Bu düzenli deyim, 'istendiği sayıda boşluk' + 'script' şeklinde bir kd verisi ile uyum sağlayabilecektir. Geri döndürülen dizinin üçüncü elemanı ise, her zamanki gibi bir 'script' değeri olmaktadır.

Aşağıda görülen programda ise, global arama anahtarı açık olarak aynı arama tekrarlanmaktadır. Bu programın, bir uygulama sayfasında verdiği sonuç aşağıda görülmektedir.

...

var kd = 'JavaScript', sonuç = null;

sonuç= kd.match(/(Java)*(Script)/gi);
			
if (sonuç !== null) {
sonuçYaz('Sonuç : ', sonuç, 'b9.2.10-uyg-2-sonuç-1');
}

else{
bilgiYaz('Uyuşma Sağlanamadı !',  'b9.2.10-uyg-2-sonuç-1');
}

...
		

Program Sonucu :

Bazı basit durumlarda, match() metodunun döndüreceği değer önceden kolaylıkla kestirilebilir. Aşağıda görülen programda, global arama anahtarı kapalı olarak bir uyuşma aranmaktadır. Bu programın, bir uygulama sayfasında verdiği sonuç aşağıda görülmektedir.

...

var kd = 'Çağdaşlık sadece bilimle sağlanabilir.', sonuç = null;

sonuç= kd.match(/il/);
			
if (sonuç !== null) {
sonuçYaz('Sonuç : ', sonuç, 'b9.2.10-uyg-3-sonuç-1');
}

else{
bilgiYaz('Uyuşma Sağlanamadı !',  'b9.2.10-uyg-3-sonuç-1');
}

...
		

Program Sonucu :

yukarıdaki programda, global arama yapılmadığı için, match() metodu, arama yaptığı kd verisini soldan sağa doğru taramakta ve ilk uyuşmanın sağlanması ile aramayı sona erdirerek uyuşma sonucunu döndürmektedir.

Aşağıda görülen programda ise, aynı arama, bu sefer global arama anahtarı açık olarak yapılmaktadır. Bu programın, bir uygulama sayfasında verdiği sonuç aşağıda görülmektedir.

...
var kd = 'Çağdaşlık sadece bilimle sağlanabilir.', sonuç = null;
sonuç= kd.match(/il/g);
...
		

Program Sonucu :

Yukarıdaki programda, global arama yapıldığı için, match() metodunun, ilk uyuşmada işlemi sonlandırmadığı, aramayı kd verisinin sonuna kadar devam ettirdiği ve tüm uyuşma sonuçlarını sırası ile geri döndürülen dizinin elemanlarının değeri olarak sakladığı görülmektedir.

Bu metot bazı durumlarda, konu ile fazla ilgili olmayanları şaşırtabilecek sonuçları geri döndürür. Bunun ilginç örneklerinden biri, aşağıdaki programda görülebilir. Bu programın bir uygulama, sayfasında verdiği sonuç aşağıda görülmektedir:

...

var kd = 'JavaScript', sonuç = null;

sonuç= kd.match(/(J)*(Script)/i);
			
if (sonuç !== null) {
sonuçYaz('Sonuç : ', sonuç, 'b9.2.10-uyg-5-sonuç-1');
}

else{
bilgiYaz('Uyuşma Sağlanamadı !',  'b9.2.10-uyg-5-sonuç-1');
}

...
		

Program Sonucu :

Yukarıdaki program, ilk olark en geniş kapsamlı uyuşma araması olan jscript (küçük/büyük harf önemsiz) sözcüğünün aranması ile başlar ve başarısız olur. Buna açgözlü uyuşma (greedy match) adı verilir. Bundan sonra script sözcüğü aranır ve bulunur. Bundan sonra null string adı verilen boş bir karakter dizigisi aranır ve tüm kd verileri boş karakter dizigisi ile uyum sağlar. Geri döndürülen dizideki ikinci eleman bu uyuşmadan kaynaklanan boş elemandır. Sonuncu uyuşma ve geri döndürülen dizinin son elemanı yine script sözcüğüdür.

Valid XHTML 1.1