(回答の最後にあるES2015アップデートを参照してください。)
質問にstring
との両方のタグを付けましregex
た。
JavaScriptでは、バックスラッシュは文字列リテラルと正規表現の両方で特別な意味を持っています。文字列または正規表現に実際の円記号が必要な場合は、次の2つを記述する必要があります\\
。
この文字列は1つの円記号で始まり、リテラルに最初に表示されるのは、次の文字を文字どおりに取得するように指示するエスケープ文字です。
var str = "\\I have one backslash";
この正規表現は、1つの円記号(2つではない)に一致します。繰り返しますが、リテラルで最初に表示されるのは、文字通り次の文字を取るように指示するエスケープ文字です。
var rex = /\\/;
文字列を使用して正規表現を作成している場合(上記のように正規表現リテラルを使用するのではなく)、文字列レベルと正規表現レベルの2つのレベルを処理していることに注意してください。したがって、単一の円記号に一致する文字列を使用して正規表現を作成するには、4つを使用することになります。
// Matches *one* backslash
var rex = new RegExp("\\\\");
これは、最初に文字列リテラルを記述しているが、実際にはバックスラッシュを入れたいためです。したがって、必要な\\
バックスラッシュごとにそれを行います。ただし、正規表現では、必要\\
な実際の円記号1つごとに2つ必要であるため、文字列に2つの円記号を含める必要があります。したがって、合計4つです。これが、可能な限り使用を避ける理由の1つnew RegExp(string)
です。混乱しやすいです。:-)
ES2015およびES2018の更新
2015年に早送りすると、Dolphin_Woodが指摘しているように、新しいES2015標準では、テンプレートリテラル、タグ関数、およびString.raw
関数が提供されます。
// Yes, this unlikely-looking syntax is actually valid ES2015
let str = String.raw`\apple`;
str
、、、、、、の文字が含まれる\
ことにa
なります。これはテンプレートリテラルであり、置換を開始するため、「文字列」(テンプレート)に何も含まれていないことに注意してください。例えば:p
p
l
e
${
${
let foo = "bar";
let str = String.raw`\apple${foo}`;
...最終的には\applebar
。更新:無効なエスケープシーケンスを許可するようにテンプレートリテラルを更新したES2018の時点で、以下は当てはまりません。詳細はこちらをご覧ください。また、これはC#などの「逐語的」文字列とはまったく異なります。仕様のLegacyOctalEscapeSequenceに一致するシーケンスは許可されておらず、構文エラーが発生するためです。だから例えば
// Fails
let str = String.raw`c:\foo\12\bar`;
\12
...従来の8進数リテラルのように見えるため、失敗します。