web-dev-qa-db-ja.com

文字列でバックスラッシュ(\)を使用するにはどうすればよいですか?

single backslashから実行済み(意味しないhtml)からの入力。

特殊文字をタブ、改行、その他多くの文字として取得し、\\tまたは\\nまたは\\(someother character)しかし、非特殊文字が隣にある場合、単一のバックスラッシュを取得できません。

次のようなものは必要ありません。

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

0で文字を取得しようとすると、\ではなくaが取得されます。

33
Mik

(回答の最後にあるES2015アップデートを参照してください。)

質問にstringregexの両方のタグを付けました。

JavaScriptでは、文字列リテラルと正規表現の両方でバックスラッシュに特別な意味があります。文字列または正規表現に実際のバックスラッシュが必要な場合は、_\\_の2つを記述する必要があります。

この文字列はoneバックスラッシュで始まります。リテラルに最初に表示されるのは、次の文字をそのまま使用するように指示するエスケープ文字です。

_var str = "\\I have one backslash";
_

この正規表現は、singleバックスラッシュ(2つではない)に一致します。繰り返しますが、リテラルで最初に表示されるのは、次の文字をそのまま使用するように指示するエスケープ文字です。

_var rex = /\\/;
_

文字列を使用して正規表現を作成する場合(上記のように正規表現リテラルを使用するのではなく)、文字列レベルと正規表現レベルの2つのレベルを処理していることに注意してください。したがって、単一のバックスラッシュと一致する文字列を使用して正規表現を作成するには、fourを使用します。

_// Matches *one* backslash
var rex = new RegExp("\\\\");
_

それは、最初に文字列リテラルを書いているのに、実際にバックスラッシュを入れたいからです。そのため、必要なバックスラッシュごとに_\\_を使用します。ただし、正規表現alsoでは、必要な実際のバックスラッシュごとに2つの_\\_が必要であるため、文字列に2つのバックスラッシュを表示する必要があります。したがって、合計4つ。これは、可能な限りnew RegExp(string)の使用を避ける理由の1つです。私は簡単に混乱します。 :-)

ES2015アップデート

2015年に早送りし、 Dolphin_Woodが指摘したように 新しいES2015標準はテンプレートリテラル、タグ関数、および _String.raw_ 関数を提供します。

_// Yes, this unlikely-looking syntax is actually valid ES2015
let str = String.raw`\Apple`;
_

strには、_\_、appl、およびeという文字が含まれます。これはテンプレートリテラルであり、_${_は置換を開始するため、「文字列」(テンプレート)には_${_がないことに注意してください。例えば。:

_let foo = "bar";
let str = String.raw`\Apple${foo}`;
_

...最終的には_\applebar_になります。また、これはC#などの「逐語的」文字列とはまったく異なり、仕様の LegacyOctalEscapeSequence に一致するシーケンスは許可されず、構文エラー。例えば

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

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

40
T.J. Crowder

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

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

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

12
Andy E

String.raw 方法:

str = String.raw`\Apple` // "\Apple"

ここでの参照: String.raw()

10
Dolphin_Wood