正規表現JavaScriptで疑問符をエスケープする


90

これは簡単な質問だと思います。

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

?キャラクターのせいで動作しません……でエスケープしてみました\が、動作しません。?特殊文字としてではなく、文字通り使用する別の方法はありますか?


これの最悪の部分は、正規表現の代わりに文字列を使用してもこの問題が発生することです。たとえばstr.search("?")、正規表現ではなく、正規表現として扱われるべきではないため、これは間違いなくバグのようです。🤦
Synetech

回答:


150

2つの円記号でエスケープする必要があります

\\?

詳細については、こちらをご覧ください。

http://www.trans4mind.com/personal_development/JavaScript/Regular%20Expressions%20Simple%20Usage.htm


17
…1つは正規表現用で、もう1つは文字列の宣言用です。
ガンボ

心が張り裂ける!正規表現で何年も働いた後、私はすべてを見たと思いました。しかし、いいえ、ここに行きます。ダブルエスケープ。いつかトリプルが見えると思います。
ジオ

26

スラッシュを使用する必要があります。

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

どうして?JavaScriptでは\、文字列の文字をエスケープするためにも使用されるため、「\?」になります:"?"

そして"\\?""\?"


16

正規表現を引用符の代わりにスラッシュで区切り、次に1つの円記号で区切って疑問符をエスケープできます。これを試して:

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

6

既知のパターンがある場合(つまり、RegExpを構築するために変数を使用しない場合)は、特殊な正規表現メタ文字をエスケープするために単一のバックスラッシュを使用するだけでよいリテラル正規表現表記を使用してください。

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

あなたは、動的に使用正規表現を構築する必要があるときはいつでもRegExp、コンストラクタ表記あなたがしなければならないリテラルバックスラッシュを表すために彼らのためにバックスラッシュを二重に

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

また、String.raw文字列リテラルをそのまま使用する場合\(変数を正規表現パターンに入れることができるテンプレート文字列リテラルの使用例を参照):

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

必読:RegExp: MDNでの説明

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.