SORU
6 Aralık 2010, PAZARTESİ


Sinek dize değişkenleri kullanarak JavaScript yukarıdaki diyagram oluşturabilir miyim?

Şöyle demişlerdir yeniden kullanılabilir yapmak istedim:

function replace_foo(target, replacement) {
   return target.replace("string_to_replace",replacement);
}

Böyle şeyler yapabilirim:

function replace_foo(target, string_to_replace, replacement) {
   return target.replace(string_to_replace,replacement);
}

Dize hazır olan bu kolay bir işlemdir. Ama eğer düzenli ifade ile biraz daha zor almak için ne yapmalıyım? Örneğin, her şeyi değiştirmek istiyorum diyelimamastring_to_replace. İnstinctually yaparak yukarıda uzatmak için denemek istiyorum gibi bir şey

function replace_foo(target, string_to_replace, replacement) {
   return target.replace(/^string_to_replace/,replacement);
}

Bu iş gibi görünmüyor. Benim tahminim string_to_replace bir dize yerine bir değişkeni temsil eden bir dize olduğunu düşünüyor. Sinek dize değişkenleri kullanarak JavaScript yukarıdaki diyagram oluşturmak mümkün mü? Böyle bir şey harika ama mümkünse olurdu:

function replace_foo(target, string_to_replace, replacement) {
   var regex = "/^"   string_to_replace   "/";
   return target.replace(regex,replacement);
}

CEVAP
6 Aralık 2010, PAZARTESİ


Dize hazır olan bu kolay bir işlemdir.

Pek değil! Örnek sadece değiştiririlkstring_to_replace oluşumu. Daha sık bu durumda, (/.../g) global bir RegExp içine bir dize dönüştürmek için tüm tekrarlarını değiştirmek istiyorsunuz. new RegExp oluşturucu kullanarak bir dize bunu yapabilirsiniz

new RegExp(string_to_replace, 'g')

Bu sorun, dize içinde düzenli-özel tüm karakterleri normal karakterler yerine kendi özel şekillerde davranır. Ters eğik çizgi kaçış onları tamir etmesi gerekir. Ne yazık ki, yerleşik bir işlev burada kullanabileceğiniz bir nedenle sizin için bunu yapmak için değil

function escapeRegExp(s) {
    return s.replace(/[-/\\^$* ?.()|[\]{}]/g, '\\$&')
}

replace(), değiştirme dizesinde bir RegExp kullandığınızda, $ şimdi çok özel bir karakteri vardır unutmayın. Bu da eğer $ senin yerine edebi bir metin olmasını istiyorsanız kaçmış olmalı!

function escapeSubstitute(s) {
    return s.replace(/\$/g, '$$$$');
}

(Dört $s yerine string—argh kendisi! çünkü)

Şimdi dize yerine RegExp ile küresel uygulayabilirsiniz:

function replace_foo(target, string_to_replace, replacement) {
    var relit= escapeRegExp(string_to_replace);
    var sub= escapeSubstitute(replacement);
    var re= new RegExp(relit, 'g');
    return target.replace(re, sub);
}

Ne acı. Neyse ki, eğer yapmak istediğin buysa eğer düz bir dize düzenli ifade hiçbir ek parça ile değiştirin, daha hızlı bir yolu var:

s.split(string_to_replace).join(replacement)

...ve hepsi bu. Bu çok anlaşılır bir deyim vardır.

her şeyi değiştirin ama string_to_replace

Bu, bir metin dizesini karşı oynanan karşılaşmada yer almayan tüm uzanır değiştirmek istediğiniz ne anlama geliyor? ^ ile yerine kesinlikle ^ demek bir dizesi başlangıç belirteci değil, çünkü bu bir olumsuzluk değil,. ^ [] karakter grupları içinde yalnızca bir parçası. Ayrıca (?!...), ama genel olarak kaçınmanız gerekir; böylece JScript ile sorunları var negatif lookaheads vardır.

‘Şey’ dizesi, ve eşleşen dizeleri arasında herhangi bir boş streç atmak için bir fonksiyonu . eşleşen deneyebilirsiniz

var re= new RegExp('(.*)($|' escapeRegExp(string_to_find) ')')
return target.replace(re, function(match) {
    return match[1]===''? match[2] : replacement match[2];
});

Burada, yine, bir bölünme daha basit olabilir:

var parts= target.split(string_to_match);
for (var i= parts.length; i-->0;)
    if (parts[i]!=='')
        parts[i]= replacement;
return parts.join(string_to_match);

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Damian Winter

    Damian Winte

    27 ŞUBAT 2007
  • Matt Davis

    Matt Davis

    4 ŞUBAT 2006
  • Within Temptation

    Within Tempt

    18 EYLÜL 2006