2017-05-23 15 views
1

のは、私は、この文字列なぜこのRegExpはString.replaceでバックスラッシュを削除していますか?

があるとしましょう、私はいくつかの文字列で$プロジェクト名$のすべての出現箇所を交換したいです。例えば。 TESTでそれを交換すると得られるはず:

"examples\output\TEST\TEST.csproj" 

を、私はこれを達成するために来ている最も近いです:

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

"examplesoutputTESTTEST.csproj" 

を書く場合でも...

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

...これにより、まだb

"examplesTEST$projectname$$projectname$.csproj" 

なぜこれが起こるのですか?これを防止するにはどうすればよいですか?

+1

私は間違っているかもしれませんが、あなたはエスケープ文字( '/')をバックスラッシュの前に置く必要があると思います。 –

+1

これは正規表現ではなく、最初の文字列が間違っているだけです。 [read](https://stackoverflow.com/questions/3903488/javascript-backslash-in-variables-is-causing-an-error) – James

答えて

2

バックスラッシュは最初の場所でさえありません。

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

あなたが与えられた文字列リテラルにバックスラッシュをエスケープする必要があります。文字列リテラル"\$"は、"$"と評価されます。しかし"\\$"文字列リテラルは"\$"と評価されます:

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

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

+0

ありがとうございました。私の最初の解決策(あなたと同じように)は、パスが変数にあるコードで実際に動作します。私はテスト設定のために文字列リテラルのバックスラッシュをエスケープすることを忘れていました。 – mode777

2

、あなたの文字列リテラル内のバックスラッシュは文字を維持し、エスケープ文字として動作している(他の多くの言語と同様に)それらの後;スラッシュが消えるという効果があります。

"examplesoutput$projectname$$projectname$.csproj" 

、と解釈されますが、バックスラッシュをエスケープするバックスラッシュを使用する必要があります:これは、のように書かあなたの文字列があることを意味

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

注意例えば、Windowsのファイルパスを返すAPIからの単一のバックスラッシュを含む文字列がある場合、バックスラッシュは既に文字列の一部であるため、既存のものをエスケープするために処理する必要はありませんスラッシュs。

オリジナルのコードに戻って、新しいRegExpオブジェクトを作成する必要はありません。 Javascriptは正規表現リテラルをサポートしています。したがって、あなたは書くことができます:

"examples\\output\\$projectname$\\$projectname$.csproj" 
.replace(/\$projectname\$/g, "TEST") 
関連する問題