JavaScript kullanarak bir dizedeki tüm noktaları değiştirme


426

.Bir JavaScript dizesinde bir dot ( ) oluşumlarını değiştirmek istiyorum

Örneğin, ben var:

var mystring = 'okay.this.is.a.string';

Almak istediğim: okay this is a string.

Şimdiye kadar denedim:

mystring.replace(/./g,' ')

ancak bu, tüm dizenin boşluklarla değiştirilmesiyle sonuçlanır.


8
aefxx'ın cevabı doğrudur, ancak bir FYI'nın, normal ifadedeki dönem karakterinin her şeyle eşleşmesi anlamına geldiği , dolayısıyla her şeyin bir boşluk olduğu anlamına gelir . Ters eğik çizgiyle kaçmak, periyodlarla eşleşme anlamına gelir.
swilliams

Bahşiş için teşekkürler. Regex ile (uygulama oluştururken) bazı AHA anları var. Gerçekten nefret ediyorum _ , havalı, iyi bir öğreticiniz var mı?
Omar Abid

rubular.com aradığınız budur
LanguagesNamedAfterCofee

1
Bu önemsiz bir şey için normal ifade kullanmayın .
Steven Lu

Ne yazık ki regex olmayan bir dizenin birden çok kez değiştirilmesine izin verebilir gibi görünmüyor.
Steven Lu

Yanıtlar:


777

Kaçmak gerekir .çünkü düzenli bir ifadede "keyfi bir karakter" anlamına gelir.

mystring = mystring.replace(/\./g,' ')

25
sadece açıklığa kavuşturmak için, \ gibi normal ifadelerde özel karakterlerden kaçar. bu durumda
realgt

sed gibi görünüyor .. nasılsa .. :)
Paschalis

reagukar ifadesinde nokta. her şey demek, bu doğru çözüm!
Benjamin Fuentes

1
@Kingalione Ne işe yaramaz? Açıklayabilir misiniz?
aefxx

1
@Webwoman İfadenin gsonundaki değiştirici bunun için kullanılır. Bunu (g) ​​lobal olarak düşünün.
aefxx

302

Anlaması kolay bir çözüm daha :)

var newstring = mystring.split('.').join(' ');

25
@HaggleLad çünkü regex ile
uğraşmanıza

5
Bu normal ifadeden daha yavaş değil mi?
Jasper Kennis

1
@ Anladığım kadarıyla, aslında kendim kıyaslamamış olsam da, çoğu tarayıcıda daha hızlı.
andrew

9
@BetoFrega Davanızı oluşturmak için bazı ampirik veriler gibi bir şey yok :). Bağlantıyı sağladığınız için teşekkürler!
testing123

3
RegExp kullanıyorsanız, normal ifadeyi döngü dışında ayrı bir değişkende saklamak istersiniz. Normal ifadeyi derlemek / yorumlamak biraz zaman alır, ancak derlendikten sonra oldukça hızlı bir şekilde kullanılabilir. Lütfen yaptığım şu testleri deneyin: jsperf.com/replace-vs-split-join-vs-replaceall/23
sanderd17

53
/**
 * ReplaceAll by Fagner Brack (MIT Licensed)
 * Replaces all occurrences of a substring in a string
 */
String.prototype.replaceAll = function( token, newToken, ignoreCase ) {
    var _token;
    var str = this + "";
    var i = -1;

    if ( typeof token === "string" ) {

        if ( ignoreCase ) {

            _token = token.toLowerCase();

            while( (
                i = str.toLowerCase().indexOf(
                    _token, i >= 0 ? i + newToken.length : 0
                ) ) !== -1
            ) {
                str = str.substring( 0, i ) +
                    newToken +
                    str.substring( i + token.length );
            }

        } else {
            return this.split( token ).join( newToken );
        }

    }
return str;
};

alert('okay.this.is.a.string'.replaceAll('.', ' '));

Normal ifade kullanmaktan daha hızlı ...

EDIT:
Belki de bu kodu yaptığım zaman jsperf kullanmadım. Ancak sonuçta bu tartışma tamamen anlamsızdır, performans farkı gerçek dünyada kodun okunabilirliğine değmez, bu nedenle performans normal ifade yaklaşımından farklı olsa bile cevabım hala geçerlidir.

EDIT2:
Akıcı bir arabirim kullanarak bunu yapmanızı sağlayan bir lib oluşturdum:

replace('.').from('okay.this.is.a.string').with(' ');

Bkz. Https://github.com/FagnerMartinsBrack/str-replace .


1
Çok kullanışlı. FYI: Uyarı ifadesinde noktalı virgülden sonra hileli karakterler var.
Patrick

Ne demek "haydut karakter" için?
Fagner Brack

1
O varlık anlamına gelir & # 8203; iki kez, yani Unicode Karakter 'SIFIR GENİŞLİK ALANI' (U + 200B). Fileformat.info/info/unicode/char/200b/index.htm
Cœur

@FagnerBrack str.toLowerCase()Performans nedenleriyle büyük olasılıkla döngü dışına taşınmalısınız . Ayrıca, aradığınız dizeyi değiştirmek muhtemelen en uygunudur. Değiştirilmiş bir sürümle bir cevap gönderdim: stackoverflow.com/questions/2390789/…
sstur

@sstur Sanırım manipülasyondan sonra dizgiyi tekrar küçük harfle yazmanız gerekiyor. Aradığım dize manipüle performans önemli bir fark var mı? Bence okunabilirlik faydaları aşıyor (denenmemiş).
Fagner Brack


15

Bu basit senaryo için, javascript'te yerleşik olarak gelen yöntemleri kullanmanızı da tavsiye ederim.

Bunu deneyebilirsiniz:

"okay.this.is.a.string".split(".").join("")

Selamlar


6

Çalışması için noktaya çift ters eğik çizgi ekliyorum. Cheer.

var st = "okay.this.is.a.string";
var Re = new RegExp("\\.","g");
st = st.replace(Re," ");
alert(st);

4

Bu daha özlü / okunabilir ve Fagner Brack tarafından yayınlanandan daha iyi performans göstermelidir (toLowerCase döngüde gerçekleştirilmez):

String.prototype.replaceAll = function(search, replace, ignoreCase) {
  if (ignoreCase) {
    var result = [];
    var _string = this.toLowerCase();
    var _search = search.toLowerCase();
    var start = 0, match, length = _search.length;
    while ((match = _string.indexOf(_search, start)) >= 0) {
      result.push(this.slice(start, match));
      start = match + length;
    }
    result.push(this.slice(start));
  } else {
    result = this.split(search);
  }
  return result.join(replace);
}

Kullanımı:

alert('Bananas And Bran'.replaceAll('An', '(an)'));

1
Aslında, kaçan RegEx indexOf daha iyi performans gösterir! Kulağa doğru gelmiyor, ancak JSPerf çok daha hızlı olduğunu gösteriyor: jsperf.com/replaceall-indexof-vs-regex
sstur

Belki o kodu yaptığım zaman jsperf kullanmadım. Ama sonunda böyle bir tartışma tamamen anlamsız, performans farkı gerçek dünyada kodun okunabilirliğine değmez, bu yüzden cevabım hala geçerli.
Fagner Brack

2
String.prototype.replaceAll = function(character,replaceChar){
    var word = this.valueOf();

    while(word.indexOf(character) != -1)
        word = word.replace(character,replaceChar);

    return word;
}

3
: bunu gibi bir şey verirsek sonsuz döngüye girdi bu olsun olmaz replaceAll('&', '&')? (kuşkusuz bu OP sorusunda bir durum değildir)
Anentropik

Ancak "& amp;" bir &döngü içerir asla döngü yerine şeyler tükenmez (ve dize büyümeye devam ediyor). Hemen şimdi denedim ve tarayıcımı kilitledi ...
Anentropic

2

İşte replaceAll'ın başka bir uygulaması. Umarım birine yardımcı olur.

    String.prototype.replaceAll = function (stringToFind, stringToReplace) {
        if (stringToFind === stringToReplace) return this;
        var temp = this;
        var index = temp.indexOf(stringToFind);
        while (index != -1) {
            temp = temp.replace(stringToFind, stringToReplace);
            index = temp.indexOf(stringToFind);
        }
        return temp;
    };

Sonra kullanabilirsiniz:

var myText = "Benim Adım George";
var newText = myText.replaceAll ("George", "Michael");


1
Bu, büyük / küçük harfe duyarlı olmayan arama / değiştirme işlemlerini gerçekleştirmez. Yani işlevsel olarak eşdeğer:string.split(stringToFind).join(stringToReplace)
sstur

0

Örnek: Ben tüm çift Alıntı (") yerine tek Alıntı (') değiştirmek istiyorum Sonra kod böyle olacak

var str= "\"Hello\""
var regex = new RegExp('"', 'g');
str = str.replace(regex, '\'');
console.log(str); // 'Hello'

0

@ scripto's biraz daha özlü ve olmadan prototype:

function strReplaceAll(s, stringToFind, stringToReplace) {
    if (stringToFind === stringToReplace) return s;
    for (let index = s.indexOf(stringToFind); index != -1; index = s.indexOf(stringToFind))
        s = s.replace(stringToFind, stringToReplace);
    return s;
}

İşte istifleme şekli: http://jsperf.com/replace-vs-split-join-vs-replaceall/68


0
String.prototype.replaceAll = function (needle, replacement) {
    return this.replace(new RegExp(needle, 'g'), replacement);
};

0
mystring.replace(new RegExp('.', "g"), ' ');

-1

RegExp javasscript nesnesini kullanarak herhangi bir dizenin / karakterin tüm oluşumunu değiştirebilirsiniz.

İşte kod,

var mystring = 'okay.this.is.a.string';

var patt = new RegExp("\\.");

while(patt.test(mystring)){

  mystring  = mystring .replace(".","");

}

-5
var mystring = 'okay.this.is.a.string';
var myNewString = escapeHtml(mystring);

function escapeHtml(text) {
if('' !== text) {
    return text.replace(/&/g, "&")
               .replace(/&lt;/g, "<")
               .replace(/&gt;/g, ">")
               .replace(/\./g,' ')
               .replace(/&quot;/g, '"')
               .replace(/&#39/g, "'");
} 

HTML'den kaçmak için şunu kullanıncreateTextNode
Downgoat
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.