web-dev-qa-db-fra.com

Comment puis-je utiliser des barres obliques inverses (\) dans une chaîne?

J'ai essayé de nombreuses façons d'obtenir une barre oblique inverse simple à partir d'un exécuté (je ne veux pas dire une entrée de html).

Je peux obtenir des caractères spéciaux comme tabulation, nouvelle ligne et bien d'autres, puis les échapper vers \\t Ou \\n Ou \\(someother character) mais je ne peux pas obtenir une seule barre oblique inverse quand un caractère non spécial est à côté.

Je ne veux pas quelque chose comme:

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

et si j'essaie d'obtenir un caractère à 0, j'obtiens a au lieu de \.

33
Mik

(Voir la mise à jour ES2015 à la fin de la réponse.)

Vous avez marqué votre question à la fois string et regex.

En JavaScript, la barre oblique inverse a une signification particulière à la fois dans les littéraux de chaîne et dans les expressions régulières. Si vous voulez une barre oblique inverse réelle dans la chaîne ou l'expression régulière, vous devez en écrire deux: _\\_.

Cette chaîne commence par une barre oblique inverse, la première que vous voyez dans le littéral est un caractère d'échappement qui nous dit de prendre le caractère suivant littéralement:

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

Cette expression régulière correspondra à une barre oblique inverse simple (pas deux); encore une fois, le premier que vous voyez dans le littéral est un caractère d'échappement qui nous dit de prendre le caractère suivant littéralement:

_var rex = /\\/;
_

Si vous utilisez une chaîne pour créer une expression régulière (plutôt que d'utiliser un littéral d'expression régulière comme je l'ai fait ci-dessus), notez que vous avez affaire à deux niveaux: le niveau de chaîne et le niveau d'expression régulière. Donc, pour créer une expression régulière en utilisant une chaîne qui correspond à une seule barre oblique inverse, vous finissez par utiliser quatre :

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

C'est parce que d'abord, vous écrivez un littéral de chaîne, mais vous voulez vraiment y mettre des barres obliques inverses. Donc, vous faites cela avec _\\_ pour chaque barre oblique inverse que vous voulez. Mais votre expression régulière aussi nécessite deux _\\_ pour chaque barre oblique inverse réelle que vous voulez, et il doit donc voir deux barres obliques inverses dans la chaîne. Par conséquent, un total de quatre. C'est l'une des raisons pour lesquelles j'évite d'utiliser new RegExp(string) chaque fois que je le peux; Je m'embrouille facilement. :-)

Mise à jour ES2015

Avance rapide jusqu'en 2015, et comme le souligne Dolphin_Wood la nouvelle norme ES2015 nous donne des littéraux de modèle, des fonctions de balise et la fonction _String.raw_ :

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

str finit par avoir les caractères _\_, a, p, p, l et e dedans. Faites juste attention qu'il n'y ait pas _${_ dans votre "chaîne" (modèle), car il s'agit d'un modèle littéral et _${_ démarre une substitution. Par exemple.:

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

... finit par être _\applebar_. Notez également que ce n'est pas tout à fait comme des chaînes "verbatim" en C # ou similaire, car les séquences correspondant à LegacyOctalEscapeSequence dans la spécification ne sont pas autorisées et provoquent une erreur de syntaxe. Donc par exemple

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

... échoue parce que _\12_ ressemble à un littéral octal hérité.

40
T.J. Crowder

\ est un caractère d'échappement, lorsqu'il est suivi d'un caractère non spécial, il ne devient pas littéral \. Au lieu de cela, vous devez le doubler \\.

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

Il n'y a aucun moyen d'obtenir la définition de chaîne brute d'origine ou de créer une chaîne littérale sans caractères d'échappement.

12
Andy E

Essayez String.raw méthode:

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

Référence ici: String.raw ()

10
Dolphin_Wood