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

  • Edge-CGI 3D Tutorials and more!

    Edge-CGI 3D

    11 HAZİRAN 2013
  • Random Act of Kindness Video Contest

    Random Act o

    18 EYLÜL 2012
  • modica89

    modica89

    24 HAZİRAN 2007