Pertanyaan Beberapa pengganti char elegan di JavaScript / jQuery


Saya memiliki string JS yang perlu beberapa karakternya diganti.

Misalnya, untuk string input:

s = 'ABAC'

Saya ingin mengganti semua Bdengan Cdan sebaliknya. Namun, melakukan penggantian regex standar tidak cukup baik karena replace()s seharusnya tidak terjadi dalam berbaris tetapi dalam satu laluan pada string.

>>> s.replace(/B/g, 'C').replace(/C/g, 'B')
'ABAB' // not good

Adakah cara yang elegan untuk melakukan beberapa string replace() dalam sekali lompatan?

(Solusi harus berfungsi untuk pengganti pengganti yang sewenang-wenang)


4
2018-03-02 15:08


asal


Jawaban:


var str = 'ABACACCBA',
    out = str.replace(/[CB]/g, function(c) {
        return {
            "B" : "C",
            "C" : "B"
        }[c];
    });

console.log(out);  /* ACABABBCA */

yang harus Anda lakukan adalah mendefinisikan semua karakter untuk dicocokkan dan kemudian objek dengan aturan swapping. Alternatif juga bisa dilakukan dengan cara ini

var str = 'ABACACCBA',
    out = str.replace(/\w/g, function(c) {
        return {
            "B" : "C",
            "C" : "B"
        }[c] || c;
    });

console.log(out);  /* ACABABBCA */

dalam contoh ini Anda menjalankan fungsi untuk setiap karakter yang cocok, tetapi Anda membuat swap hanya jika Anda mendefinisikan entri ke objek (jika tidak, Anda mengembalikan karakter asli).

Ini jelas lebih mahal (jadi lebih baik gunakan contoh pertama) tetapi dalam hal ini Anda menghindari daftar semua karakter untuk dicocokkan dalam ekspresi reguler.


9
2018-03-02 15:19



Anda menginginkan a translate fungsi; Lihat pertanyaan ini untuk contoh implementasi.


0
2018-03-02 15:12



Mungkin ada cara yang lebih baik untuk melakukannya, tetapi saya biasanya melakukan sesuatu yang sederhana seperti ini ....

s.replace(/B/g, '##_B_##').replace(/C/g, 'B').replace(/##_B_##/g, 'C');

Pada dasarnya, buat BS unik sebelum mengganti C dengan B sehingga BS asli masih bisa diidentifikasi.


0
2018-03-02 15:15