melarikan diri dari tanda tanya dalam javascript regex

90

Ini adalah pertanyaan sederhana menurut saya.

Saya mencoba mencari terjadinya string di string lain menggunakan regex di JavaScript seperti:

 var content ="Hi, I like your Apartment. Could we schedule a viewing? My phone number is: ";

 var gent = new RegExp("I like your Apartment. Could we schedule a viewing? My", "g");

 if(content.search(gent) != -1){   
     alert('worked');     
 }          

Ini tidak berhasil karena ?karakternya .... Saya mencoba melarikan diri dengan \, tetapi itu juga tidak berhasil. Apakah ada cara lain untuk menggunakan ?secara harfiah selain sebagai karakter khusus?

Andrew
sumber
Bagian terburuk tentang ini adalah bahwa bahkan menggunakan string alih-alih regex menyebabkan masalah ini, misalnya str.search("?")Itu pasti tampak seperti bug karena itu bukan regex dan tidak boleh diperlakukan sebagai satu. 🤦
Synetech

Jawaban:

26

Anda harus menggunakan garis miring ganda:

var regex = new RegExp("\\?", "g");

Mengapa? karena di JavaScript, \juga digunakan untuk melepaskan karakter dalam string, jadi: "\?" menjadi:"?"

Dan "\\?", menjadi "\?"

Christian C. Salvadó
sumber
16

Anda dapat membatasi regexp Anda dengan garis miring bukan tanda kutip lalu satu garis miring terbalik untuk menghindari tanda tanya. Coba ini:

var gent = /I like your Apartment. Could we schedule a viewing\?/g;
jiggy
sumber
6

Setiap kali Anda memiliki pola yang diketahui (yaitu Anda tidak menggunakan variabel untuk membuat RegExp), gunakan notasi regex literal di mana Anda hanya perlu menggunakan satu garis miring terbalik untuk keluar dari karakter meta regex khusus:

var re = /I like your Apartment\. Could we schedule a viewing\?/g;
                               ^^                            ^^

Kapan pun Anda perlu membuat RegExp secara dinamis, gunakan RegExpnotasi konstruktor di mana Anda HARUS menggandakan garis miring terbalik agar garis miring terbalik tersebut menunjukkan garis miring terbalik :

var questionmark_block = "\\?"; // A literal ?
var initial_subpattern = "I like your Apartment\\. Could we schedule a viewing"; // Note the dot must also be escaped to match a literal dot
var re = new RegExp(initial_subpattern + questionmark_block, "g");

Dan jika Anda menggunakan String.rawliteral string, Anda dapat menggunakan \apa adanya (lihat contoh penggunaan literal string template di mana Anda dapat meletakkan variabel ke dalam pola regex):

const questionmark_block = String.raw`\?`; // A literal ?
const initial_subpattern = "I like your Apartment\\. Could we schedule a viewing";
const re = new RegExp(`${initial_subpattern}${questionmark_block}`, 'g'); // Building pattern from two variables
console.log(re); // => /I like your Apartment\. Could we schedule a viewing\?/g

Yang harus dibaca: Ekspresi Reguler: Deskripsi di MDN.

Wiktor Stribiżew
sumber