Como posso usar barras invertidas (\) em uma string?

Eu tentei muitas maneiras de obter uma única barra invertida de um executado (não me refiro a uma input de html ).

Eu posso obter caracteres especiais como guia, nova linha e muitos outros, em seguida, escapá-los para \\t ou \\n ou \\(someother character) mas não consigo obter uma única barra invertida quando um caractere não especial é próximo a ele.

Eu não quero algo como:

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

e se eu tentar obter o caractere 0, recebo a vez de \ .

(Veja a atualização do ES2015 no final da resposta.)

Você marcou sua pergunta como string e regex .

Em JavaScript, a barra invertida tem um significado especial em literais de string e em expressões regulares. Se você quiser uma barra invertida real na string ou regex, você tem que escrever dois: \\ .

Esta string começa com uma barra invertida, a primeira que você vê no literal é um caractere de escape nos dizendo para pegar o próximo caractere literalmente:

 var str = "\\I have one backslash"; 

Essa expressão regular corresponderá a uma única barra invertida (não duas); novamente, o primeiro que você vê no literal é um caractere de escape nos dizendo para pegar o próximo caractere literalmente:

 var rex = /\\/; 

Se você estiver usando uma string para criar uma expressão regular (em vez de usar um literal de expressão regular como eu fiz acima), observe que você está lidando com dois níveis: o nível da string e o nível da expressão regular. Portanto, para criar uma expressão regular usando uma string que corresponda a uma única barra invertida, você acaba usando quatro :

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

Isso é porque, primeiro, você está escrevendo uma string literal, mas você quer colocar barras invertidas nela. Então você faz isso com \\ para cada barra invertida que você quiser. Mas o seu regex também requer dois \\ para cada barra invertida real desejada e, portanto, ele precisa ver duas barras invertidas na string. Assim, um total de quatro. Esta é uma das razões pelas quais evito usar o new RegExp(string) sempre que posso; Eu me confundo facilmente. 🙂

Atualização ES2015

Avance rapidamente para 2015 e, como a Dolphin_Wood aponta, o novo padrão ES2015 nos fornece modelos literais, funções de tags e a function String.raw :

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

str termina com os caracteres \ , a , p , p , l e e nele. Apenas tenha cuidado, não há ${ na sua “string” (template), já que este é um literal de template e ${ inicia uma substituição. Por exemplo:

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

… acaba sendo \applebar . Observe também que isso não é exatamente como “verbatim” strings em C # ou similar, já que as sequências correspondentes à LegacyOctalEscapeSequence na especificação não são permitidas e causam um erro de syntax. Então, por exemplo

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

… falha porque \12 parece com um legado octal literal.

\ é um caractere de escape, quando seguido por um caractere não especial, não se torna um literal \ . Em vez disso, você tem que dobrar \\ .

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

Não há como obter a definição original de string raw ou criar uma string literal sem caracteres de escape.

Tente o método String.raw :

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

Referência aqui: String.raw ()

str = "\apple" escapa do primeiro a , então você fica com o primeiro caractere. Não há nenhuma maneira (afaik) de fazer "\apple" manter esse ‘\’ sem escaping dele. Você poderia automatizar o escape assim:

 String.prototype.esc = function(){ return '\\'+this; } //and use it as var str = 'a'.esc()+'pple'; //or var str = 'apple'.esc(); //tests str[0]; //=> '\' str.match(/\\/); //=> ['\'] RegExp('\\\\').test(str); //=> true str.substr(0,1); // '\'