Pertanyaan Bagaimana Anda menggunakan variabel dalam ekspresi reguler?


Saya ingin membuat metode String.replaceAll () di JavaScript dan saya berpikir bahwa menggunakan RegEx akan menjadi cara yang paling singkat untuk melakukannya. Namun, saya tidak dapat menemukan cara meneruskan variabel ke dalam RegEx. Saya sudah bisa melakukan ini yang akan menggantikan semua contoh "B" dengan "A".

"ABABAB".replace(/B/g, "A");

Tetapi saya ingin melakukan sesuatu seperti ini:

String.prototype.replaceAll = function(replaceThis, withThis) {
    this.replace(/replaceThis/g, withThis);
};

Tapi jelas ini hanya akan menggantikan teks "replaceThis" ... jadi bagaimana cara saya meneruskan variabel ini ke string RegEx saya?


980
2018-01-30 00:11


asal


Jawaban:


Alih-alih menggunakan /regex/g sintaks, Anda dapat membuat yang baru RegExp obyek:

var replace = "regex";
var re = new RegExp(replace,"g");

Anda dapat secara dinamis membuat objek regex dengan cara ini. Maka Anda akan melakukan:

"mystring".replace(re, "newstring");

1379
2018-01-30 00:15



Seperti Eric Wendelin disebutkan, Anda dapat melakukan sesuatu seperti ini:

str1 = "pattern"
var re = new RegExp(str1, "g");
"pattern matching .".replace(re, "regex");

Ini menghasilkan "regex matching .". Namun, itu akan gagal jika str1 adalah ".". Anda mengharapkan hasilnya "pattern matching regex", mengganti periode dengan "regex", tapi itu akan berubah menjadi ...

regexregexregexregexregexregexregexregexregexregexregexregexregexregexregexregexregexregex

Ini karena, meskipun "." adalah String, di konstruktor RegExp itu masih ditafsirkan sebagai ekspresi reguler, yang berarti karakter non-baris-break, yang berarti setiap karakter dalam string. Untuk tujuan ini, fungsi berikut mungkin berguna:

 RegExp.quote = function(str) {
     return str.replace(/([.?*+^$[\]\\(){}|-])/g, "\\$1");
 };

Maka Anda bisa melakukan:

str1 = "."
var re = new RegExp(RegExp.quote(str1), "g");
"pattern matching .".replace(re, "regex");

menghasilkan "pattern matching regex".


167
2018-01-30 01:02



"ABABAB".replace(/B/g, "A");

Seperti biasa: jangan gunakan regex kecuali Anda harus. Untuk mengganti string sederhana, idiomnya adalah:

'ABABAB'.split('B').join('A')

Maka Anda tidak perlu khawatir tentang masalah mengutip yang disebutkan dalam jawaban Gracenotes.


83
2018-02-01 03:43



Bagi siapa saja yang ingin menggunakan variabel dengan pertandingan metode, ini bekerja untukku

var alpha = 'fig';
'food fight'.match(alpha + 'ht')[0]; // fight

27
2017-11-28 15:32



Ini:

var txt=new RegExp(pattern,attributes);

setara dengan ini:

var txt=/pattern/attributes;

Lihat http://www.w3schools.com/jsref/jsref_obj_regexp.asp.


20
2018-01-30 00:19



this.replace( new RegExp( replaceThis, 'g' ), withThis );

14
2018-01-30 00:16



String.prototype.replaceAll = function (replaceThis, withThis) {
   var re = new RegExp(replaceThis,"g"); 
   return this.replace(re, withThis);
};
var aa = "abab54..aba".replaceAll("\\.", "v");

Uji dengan ini alat 


9
2018-02-01 09:14



Anda ingin membangun ekspresi reguler secara dinamis dan untuk ini solutuion yang tepat adalah dengan menggunakan new RegExp(string) konstruktor. Agar konstruktor untuk memperlakukan karakter khusus secara harfiah, Anda harus menghindarinya. Ada fungsi built-in di widget pelengkapan otomatis UI jQuery bernama $.ui.autocomplete.escapeRegex:

[...] Anda dapat menggunakan built-in    $.ui.autocomplete.escapeRegex fungsi. Ini akan membutuhkan satu string   argumen dan melarikan diri semua karakter regex, membuat hasilnya aman untuk   diberikan kepada new RegExp().

Jika Anda menggunakan jQuery UI Anda dapat menggunakan fungsi itu, atau menyalin definisinya dari sumbernya:

function escapeRegex(value) {
    return value.replace( /[\-\[\]{}()*+?.,\\\^$|#\s]/g, "\\$&" );
}

Dan gunakan seperti ini:

"[z-a][z-a][z-a]".replace(new RegExp(escapeRegex("[z-a]"), "g"), "[a-z]");
//            escapeRegex("[z-a]")       -> "\[z\-a\]"
// new RegExp(escapeRegex("[z-a]"), "g") -> /\[z\-a\]/g
// end result                            -> "[a-z][a-z][a-z]"

7
2017-09-14 19:55



Meskipun Anda dapat membuat RegExp yang dibuat secara dinamis (sesuai dengan tanggapan lain untuk pertanyaan ini), saya akan mengulangi komentar saya dari pos serupa: Bentuk fungsional dari String.replace () sangat berguna dan dalam banyak kasus mengurangi kebutuhan akan objek RegExp yang dibuat secara dinamis. (yang agak merepotkan karena Anda harus mengekspresikan input ke konstruktor RegExp sebagai string daripada menggunakan garis miring / [A-Z] + / regexp literal format)


3
2018-01-30 01:02



Berikut ini implementasi replaceAll lainnya:

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

3
2018-05-08 10:30