52

実行されたものから単一のバックスラッシュを取得するために多くの方法を試しました(からの入力を意味するものではありません)。 html

タブ、改行、その他の多くの特殊文字を取得してから\\tor \\norにエスケープできますが、非特殊文字が隣に \\(someother character)ある場合、単一のバックスラッシュを取得できません。

私は次のようなものを望んでいません:

str = "\apple";   // I want this, to return:
console.log(str); // \apple

0 で文字を取得しようとすると、a代わりに が取得され\ます。

4

4 に答える 4

66

(回答の最後にある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なります。これはテンプレートリテラルであり、置換を開始するため、「文字列」(テンプレート)に何も含まれていないことに注意してください。例えば:pple${${

let foo = "bar";
let str = String.raw`\apple${foo}`;

...最終的には\applebar更新:無効なエスケープシーケンスを許可するようにテンプレートリテラルを更新したES2018の時点で、以下は当てはまりません。詳細はこちらをご覧ください。また、これはC#などの「逐語的」文字列とはまったく異なります。仕様のLegacyOctalEscapeSequenceに一致するシーケンスは許可されておらず、構文エラーが発生するためです。だから例えば

// Fails
let str = String.raw`c:\foo\12\bar`;

\12...従来の8進数リテラルのように見えるため、失敗します。

于 2012-04-06T10:12:46.887 に答える
15

\はエスケープ文字であり、その後に非特殊文字が続く場合、リテラルにはなりません\。代わりに、それを2倍にする必要があります\\

console.log("\apple");  //-> "apple" 
console.log("\\apple"); //-> "\apple" 

元の生の文字列定義を取得したり、エスケープ文字なしでリテラル文字列を作成したりする方法はありません。

于 2012-04-06T10:07:56.027 に答える