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.


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,' ')

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(' ');

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 .


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


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


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

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

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

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


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'

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


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

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

-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(".","");

}

-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, "'");
} 

Untuk menghindari HTML, gunakancreateTextNode
Downgoat
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.