RegExp コンストラクターを使用して正規表現を構築する場合、文字列リテラルが確実に解釈されるように文字列リテラルを二重エスケープすることが重要です正しく。この要件は、JavaScript 文字列パーサーが最初のバックスラッシュを使用し、正規表現エンジンがその意図された目的を認識しないままになるという事実から生じています。
これを説明するために、次の例を考えてみましょう。
const res = new RegExp('(\s|^)' + foo).test(moo);
この例では、文字列リテラル '(\s|^)' foo が RegExp コンストラクターに渡されて、正規表現が作成されます。ただし、最初のバックスラッシュは文字列パーサーによって消費され、「s|^)」 foo は正規表現エンジン用に残ります。この予期しない入力は、誤解を招く可能性があります。
このような誤解の具体例は、.:
const string = '.*'; console.log(string);
などの特殊文字に単一のエスケープを使用するときに発生します。この場合、目的は、 を使用して任意の文字に一致することです。ワイルドカード。ただし、 は文字列パーサーによって消費されるため、 .はワイルドカードとしてではなく、リテラルのドットとして扱われます。これにより、ドット文字のみに一致する不正な正規表現が生成されます。
これらの誤解を避けるには、RegExp コンストラクターに指定された文字列を二重エスケープすることが重要です。各特殊文字の前にバックスラッシュを追加すると、正規表現エンジンが目的のエスケープ シーケンスを正しく解析できるようになります。
以下の例では、二重エスケープが適用されます。
const string = '(\s|^)' + foo; console.log(string);
これ意図したエスケープ シーケンスを保持することで正規表現を正しく構築し、正確な一致動作を保証します。文字列リテラルで RegExp コンストラクターを使用する場合は、特殊文字の予期しない解釈を防ぐために、必ず 2 回エスケープしてください。
以上がJavaScript RegExp コンストラクターを使用するときに文字列を 2 回エスケープする必要があるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。