SORU
7 Kasım 2008, Cuma


'In Dize JavaScript bir sürümü var.() karakterlerden oluşan normal ifadeler için izin verir?

Javascript, orada Dize eşdeğerdir.() adres bilgisi hala ikinci bir parametre verirken ilk parametre bir dize yerine normal bir ifade alır ?

Gibi bir şey yapmak istiyorum

str.indexOf(/[abc]/ , i);

ve

str.lastIndexOf(/[abc]/ , i);

Dize Süre.() arama beni ikinci bir argüman belirtmek için izin vermez bir parametre olarak bir düzenli ifade alır!

Düzenleme:< / ^ br . Bu sunulan tüm çözümleri test etmek için küçük bir test işlevi yazdım aslında düşündüğümden daha zor çıktı... regexİndexOf düşünür ve regexLastİndexOf String nesnesine eklenmiş.

function test (str) {
	var i = str.length  2;
	while (i--) {
		if (str.indexOf('a',i) != str.regexIndexOf(/a/,i)) 
			alert (['failed regexIndexOf ' , str,i , str.indexOf('a',i) , str.regexIndexOf(/a/,i)]) ;
		if (str.lastIndexOf('a',i) != str.regexLastIndexOf(/a/,i) ) 
			alert (['failed regexLastIndexOf ' , str,i,str.lastIndexOf('a',i) , str.regexLastIndexOf(/a/,i)]) ;
	}
}

ve aşağıdaki gibi en az bir karakter regexp için, sonucu adres bilgisi kullansak aynı olduğundan emin olmak için test ediyorum

//Xes arasında bir bakın< / ^ br . ('') xxx; . test ^ / ^ br . ('') axx; . test ^ / ^ br . ('') xax; . test ^ / ^ br . ('') xxa; . test ^ / ^ br . ('') sunduğunu; . test ^ / ^ br . ('') xaa; . test ^ / ^ br . ('') aax; . test ^ / ^ br . ('aaa'); . test

CEVAP
8 Kasım 2008, CUMARTESİ


Bu yaklaşımlar zaten bahsedilen bir kaç (adres bilgisi belli ki oldukça basittir) birleştirerek, bu hile yapacak işlevleri olduğunu düşünüyorum:

String.prototype.regexIndexOf = function(regex, startpos) {
    var indexOf = this.substring(startpos || 0).search(regex);
    return (indexOf >= 0) ? (indexOf   (startpos || 0)) : indexOf;
}

String.prototype.regexLastIndexOf = function(regex, startpos) {
    regex = (regex.global) ? regex : new RegExp(regex.source, "g"   (regex.ignoreCase ? "i" : "")   (regex.multiLine ? "m" : ""));
    if(typeof (startpos) == "undefined") {
        startpos = this.length;
    } else if(startpos < 0) {
        startpos = 0;
    }
    var stringToWorkWith = this.substring(0, startpos   1);
    var lastIndexOf = -1;
    var nextStop = 0;
    while((result = regex.exec(stringToWorkWith)) != null) {
        lastIndexOf = result.index;
        regex.lastIndex =   nextStop;
    }
    return lastIndexOf;
}

Belli ki, yerleşik Dize nesne değiştirme çoğu insan için kırmızı bayrak göndermek istemez. ama bu o kadar da önemli değil bir zaman olabilir; sadece bunun farkında olmak.

< / ^ hr .

GÜNCELLEME: o lastIndexOf() şimdi taklit etmek için regexLastIndexOf() Düzenlenebilir. Bana eğer yine başarısız olursa haber ver ve hangi şartlar altında lütfen.

< / ^ hr .

GÜNCELLEME: tüm testleri bu sayfa üzerinde yorumlarda bulundu, ve benim kendi Geçer. Tabi ki, kurşun geçirmez olduğu anlamına gelmez. Herhangi bir geribildirim takdir.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • A Alkhaldi

    A Alkhaldi

    12 Mayıs 2007
  • Modus Recordings

    Modus Record

    26 Kasım 2008
  • NYCarspotter

    NYCarspotter

    26 EYLÜL 2011