Cara mengganti semua titik dalam string menggunakan JavaScript

426

Saya ingin mengganti semua kemunculan titik ( .) dalam string JavaScript

Sebagai contoh, saya punya:

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

Saya ingin mendapatkan: okay this is a string.

Sejauh ini saya mencoba:

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

tapi ini berakhir dengan semua string diganti menjadi spasi.

Omar Abid
sumber
8
Jawaban aefxx benar, tetapi sama seperti FYI adalah bahwa karakter titik dalam suatu regex berarti cocok dengan segala sesuatu , sehingga semuanya menjadi ruang. Mengelakinya dengan backslash berarti pertandingan pada periode.
swilliams
Terima kasih atas tipnya. Saya memiliki beberapa momen AHA (saat membangun aplikasi) dengan Regex. Saya sangat membencinya _ , apakah Anda memiliki tutorial keren dan bagus?
Omar Abid
rubular.com adalah yang Anda cari
LanguagesNamedAfterCofee
1
Jangan gunakan regex untuk sesuatu yang sepele ini.
Steven Lu
Sayangnya itu tidak terlihat seperti non-regex dapat memungkinkan penggantian string beberapa kali.
Steven Lu

Jawaban:

777

Anda perlu melarikan diri .karena memiliki arti "karakter yang berubah-ubah" dalam ekspresi reguler.

mystring = mystring.replace(/\./g,' ')
aefxx
sumber
25
hanya untuk memperjelas, \ keluar dari karakter khusus dalam ekspresi reguler, seperti. dalam hal ini
realgt
terlihat seperti sed .. entah bagaimana .. :)
Paschalis
dalam ekspresi reagukar titik. berarti semua, ini adalah solusi yang tepat!
Benjamin Fuentes
1
@ Kingalione Apa yang sebenarnya tidak berhasil? Bisakah Anda menguraikan?
aefxx
1
@Webwoman Itulah yang digunakan gpengubah pada akhir ekspresi. Anggap saja sebagai (g) secara lobal.
aefxx
302

Satu lagi solusi yang mudah dimengerti :)

var newstring = mystring.split('.').join(' ');
Umesh Patil
sumber
25
@HaggleLad karena Anda tidak perlu main-main dengan regex
ton.yeung
5
Bukankah ini jauh lebih lambat daripada regexing?
Jasper Kennis
1
@Jasper dari pemahaman saya, sebenarnya lebih cepat di sebagian besar browser, meskipun saya belum benar-benar membandingkannya sendiri.
andrew
9
@BetoFrega Tidak ada yang suka beberapa data empiris untuk membuat kasus Anda :). Terima kasih telah menyediakan tautan!
testing123
3
Jika Anda menggunakan RegExp, Anda ingin menyimpan regex dalam variabel terpisah di luar loop. Mengompilasi / menginterpretasikan suatu regex membutuhkan waktu, tetapi begitu dikompilasi, itu dapat digunakan dengan cukup cepat. Silakan coba tes yang saya buat: 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('.', ' '));

Lebih cepat daripada menggunakan regex ...

EDIT:
Mungkin pada saat saya melakukan kode ini saya tidak menggunakan jsperf. Tetapi pada akhirnya diskusi seperti itu sama sekali tidak ada gunanya, perbedaan kinerja tidak sebanding dengan keterbacaan kode di dunia nyata, jadi jawaban saya masih valid, bahkan jika kinerjanya berbeda dari pendekatan regex.

EDIT2:
Saya telah membuat lib yang memungkinkan Anda melakukan ini menggunakan antarmuka yang lancar:

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

Lihat https://github.com/FagnerMartinsBrack/str-replace .

Fagner Brack
sumber
1
Sangat berguna. FYI: Ada karakter jahat setelah titik koma di pernyataan peringatan.
Patrick
Apa yang Anda maksud untuk "karakter jahat"?
Fagner Brack
1
Ia berarti entitas & # 8203; dua kali, yang merupakan Karakter Unicode 'ZERO WIDTH SPACE' (U + 200B). Informasi lebih lanjut tentang fileformat.info/info/unicode/char/200b/index.htm
Cœur
@FagnerBrack Anda mungkin harus memindahkan str.toLowerCase()loop karena alasan kinerja. Juga, memanipulasi string yang Anda cari mungkin kurang optimal. Saya mengirim jawaban dengan versi modifikasi: stackoverflow.com/questions/2390789/…
sstur
@stur Saya kira itu diperlukan untuk huruf kecil lagi setelah manipulasi. Apakah memanipulasi string saya mencari perbedaan besar dalam kinerja? Saya kira keterbacaan melampaui manfaat (belum diuji).
Fagner Brack
22
str.replace(new RegExp(".","gm")," ")
macemer
sumber
1
Bekerja hebat untuk mengganti fungsi =)
afreeland
15

Untuk skenario sederhana ini, saya juga akan merekomendasikan untuk menggunakan metode yang disertakan dalam javascript.

Anda bisa mencoba ini:

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

Salam pembuka

Pemenang
sumber
6

Saya menambahkan garis miring terbalik ganda ke titik untuk membuatnya bekerja. Bersorak.

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

Ini lebih ringkas / mudah dibaca dan harus berkinerja lebih baik daripada yang diposting oleh Fagner Brack (toLowerCase tidak dilakukan dalam lingkaran):

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);
}

Pemakaian:

alert('Bananas And Bran'.replaceAll('An', '(an)'));
sstur
sumber
1
Sebenarnya, tampaknya lolos RegEx berkinerja lebih baik daripada indexOf! Tidak terdengar benar, tetapi JSPerf menunjukkan itu lebih cepat: jsperf.com/replaceall-indexof-vs-regex
sstur
Mungkin pada saat saya melakukan kode itu saya tidak menggunakan jsperf. Tetapi pada akhirnya diskusi seperti itu sama sekali tidak ada gunanya, perbedaan kinerja tidak sebanding dengan keterbacaan kode di dunia nyata, jadi jawaban saya masih valid.
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;
}
Joel
sumber
3
tidakkah ini akan terjebak dalam infinite loop jika Anda memberikannya sesuatu seperti replaceAll('&', '&'):? (diakui itu bukan kasus dalam pertanyaan OP)
Anentropic
Tapi "& amp;" berisi &sehingga loop tidak pernah kehabisan hal untuk diganti (dan string terus bertambah). Saya mencobanya sekarang dan mengunci browser saya ...
Anentropic
2

Berikut implementasi lain dari replaceAll. Semoga ini bisa membantu seseorang.

    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;
    };

Maka Anda dapat menggunakannya:

var myText = "Namaku George";
var newText = myText.replaceAll ("George", "Michael");

skripto
sumber
1
Ini tidak menangani pencarian / penggantian case-insensitive. Jadi secara fungsional setara dengan:string.split(stringToFind).join(stringToReplace)
sstur
0

Contoh: Saya ingin mengganti semua Kutipan ganda (") menjadi Kutipan tunggal (') Maka kodenya akan seperti ini

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

@ scripto dibuat lebih ringkas dan tanpa 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;
}

Begini caranya: http://jsperf.com/replace-vs-split-join-vs-replaceall/68

DI
sumber
0
String.prototype.replaceAll = function (needle, replacement) {
    return this.replace(new RegExp(needle, 'g'), replacement);
};
Danon
sumber
0
mystring.replace(new RegExp('.', "g"), ' ');
Idan
sumber
-1

Anda dapat mengganti semua kemunculan string / karakter menggunakan objek javasscript RegExp.

Ini kodenya,

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

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

while(patt.test(mystring)){

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

}
Rakesh Chaudhari
sumber
-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, "'");
} 
Neha
sumber
Untuk menghindari HTML, gunakancreateTextNode
Downgoat