2017-05-23 3 views
1

Sagen wir, ich diese Zeichenfolge habenWarum entfernt diese RegExp in String.replace meine Backslashes?

Ich möchte mit einigen Zeichenfolge alle Vorkommen von $ $ Projektname ersetzen. Z.B. ergeben sollte es mit TEST ersetzen:

"examples\output\TEST\TEST.csproj" 

Die nächstgelegene ich gekommen bin, dies zu erreichen, ist:

("examples\output\$projectname$\$projectname$.csproj") 
    .replace(new RegExp("\\$projectname\\$", "g"), "TEST"); 

, die ergibt:

"examplesoutputTESTTEST.csproj" 

Auch beim Schreiben ...

("examples\output\$projectname$\$projectname$.csproj") 
    .replace(new RegExp("output", "g"), "TEST"); 

... dies wird immer noch die b entfernen ackslashes

"examplesTEST$projectname$$projectname$.csproj" 

Warum passiert das und wie verhindere ich das?

+1

Ich mag falsch sein, aber ich denke, Sie müssen ein Escape-Zeichen ('/') vor Ihren Backslashes setzen. –

+1

Es ist nicht die Regex, es ist nur Ihre ursprüngliche Zeichenfolge ist falsch. [lesen] (https://stackoverflow.com/questions/3903488/javascript-backslash-in-variables-is-causing-an-error) – James

Antwort

2

Die Schrägstriche sind nicht einmal dort an erster Stelle:

// Prints "examplesoutput$projectname$$projectname$.csproj": 
 
console.log("examples\output\$projectname$\$projectname$.csproj");

Sie benötigen wörtliche die Schrägstriche in der angegebenen Zeichenfolge zu entkommen. Ein String-Literal "\$" wird zu "$" ausgewertet. Aber ein Stringliteral "\\$" wird "\$" bewerten:

var path = "examples\\output\\$projectname$\\$projectname$.csproj".replace(new RegExp("\\$projectname\\$", "g"), "TEST"); 
 

 
console.log(path); // "examples\output\TEST\TEST.csproj"

+0

Vielen Dank.Meine erste Lösung (genau wie Ihre) funktioniert in der Tat in Code, wo der Pfad in einer Variablen ist. Ich habe nur vergessen, den Backslash im String-Literal für meine Test-Setup zu entkommen. – mode777

2

In JavaScript (wie bei vielen anderen Sprachen), die Back-Schrägstriche in Ihrer Zeichenkette handeln als Escape-Zeichen, die Erhaltung der Zeichen nach ihnen; Der Effekt ist, dass die Schrägstriche verschwinden. Dies bedeutet, dass die Zeichenfolge geschrieben wie:

wie interpretiert,

"examplesoutput$projectname$$projectname$.csproj" 

Sie würden die Backslash verwenden müssen, um den Backslash zu entkommen:

"examples\\output\\$projectname$\\$projectname$.csproj" 

Hinweis Wenn Sie eine Zeichenfolge mit einzelnen Backslashes in sich haben (z. B. von einer API, die Windows-Dateipfade zurückgibt), sind die Backslashes bereits Teil der Zeichenfolge, sodass sie nicht verarbeitet werden müssen, um dem vorhandenen zu entkommen slashe s.

Zurück zu Ihrem ursprünglichen Code, müssen Sie kein neues RegExp Objekt erstellen. Javascript unterstützt Regex-Literale. So können Sie schreiben:

"examples\\output\\$projectname$\\$projectname$.csproj" 
.replace(/\$projectname\$/g, "TEST")