正则表达式 javascript 中的转义问号

我认为这是一个简单的问题。

我试图使用 JavaScript 中的正则表达式在另一个字符串中搜索字符串的出现,如下所示:

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

这不工作,因为 ?字符... 。我试图转义它与 \,但这也不工作。是否有另一种方法来使用字面上的 ?而不是作为一个特殊的字符?

125169 次浏览

You should use double slash:

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

Why? because in JavaScript the \ is also used to escape characters in strings, so: "\?" becomes: "?"

And "\\?", becomes "\?"

You can delimit your regexp with slashes instead of quotes and then a single backslash to escape the question mark. Try this:

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

Whenever you have a known pattern (i.e. you do not use a variable to build a RegExp), use literal regex notation where you only need to use single backslashes to escape special regex metacharacters:

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

Whenever you need to build a RegExp dynamically, use RegExp constructor notation where you MUST double backslashes for them to denote a literal backslash:

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

And if you use the String.raw string literal you may use \ as is (see an example of using a template string literal where you may put variables into the regex pattern):

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

A must-read: RegExp: Description at MDN.