2009-09-03 26 views
12

Javascript文字列リテラルのバックスラッシュ(エスケープ)文字を置き換えようとしています。Javascript - 文字列リテラルのエスケープ文字の置換

私はその後、リダイレクトを行うことができるように二重のバックスラッシュでそれを交換する必要があります。

var newpath = 'file:///C:\funstuff\buildtools\viewer.html'.replace(/\\/g,"\\"); 
window.location = newpath; 

しかし、何の結果を持っていないようです。

バックスラッシュをJavascriptで処理する前に適切にエスケープするオプションはありません。

Javascriptが幸せになるように(\)を(¥¥)に置き換えるにはどうすればよいですか?

おかげで、 デレク

+0

はあなたが使用することができます' .replace(/ \\/gで、 "\\\\")。たとえば、HTML文書にバックスラッシュがある場合、 'document.body.innerHTML.replace(/ \\/g、" \\\\ ");'を実行すると、すべてのバックスラッシュを二重のバックスラッシュに置き換えます。 – Viliami

答えて

21

それは文字通りのなら、あなたはJavascriptがそれらを見て前にバックスラッシュをエスケープする必要があります。その周りに方法はありません。

var newpath = 'file:///C:\\funstuff\\buildtools\\viewer.html'; 
window.location = newpath; 

newpathはどこか別の場所からその値を取得し、実際には単一のバックスラッシュを含んでいますされている場合は、あなたがそれらを二重にする必要はありません。彼らはJavaScriptによって処理される前に、正しくバックスラッシュをエスケープするオプションを持っていないのはなぜ

newpath.replace(/\\/g,"\\\\"); 

:しかし、あなたが実際にいくつかの理由のために望んでいた場合、交換してください()の呼び出しでバックスラッシュをエスケープすることを忘れないでください?問題は、JavaScriptのソース自体がちょうど脱出のレベルを追加し、エスケープ文字として\を使用していることをいくつかの他のスクリプト言語から生成されていることがある場合:

var newpath = 'file:///C:\\\\funstuff\\\\buildtools\\\\viewer.html'; 
+0

素晴らしい答えmoonshadow。 ANTのコピーとフィルタタスクによってJavascriptに補間されるため、Javascriptを表示する前にパスを変更することはできません。私は、ANTタスクの変更要求を行う必要があります。 文字列リテラルでエスケープ文字を置き換えることが不可能な理由を説明できますか?文字列オブジェクトで可能ですか? 私はこれを読みますが、この違いが存在する理由私はまだ見ていない: The Complete Javascript Strings Reference dbasch

+0

私はこれを読みますが、この違いが存在する理由私はまだ見ていない: http://www.hunlock.com/blogs – dbasch

+0

@dbasch:replace()が実行されるまでに文字列に文字が存在しなくなるため、サンプルコードで '\'文字を置き換えることはできません。それらはエスケープ文字です。文字列リテラルの解析を制御し、プロセスで消費される文字です。 – moonshadow

2

あなたは「\\\\」に置き換えする必要があります"\\"は1つの\にエスケープされているため変更されません。

+0

私はこれを試して、それは交換をしませんでした。 – dbasch

0

より良い次の例を取る、文字列エスケープ行動を示し、理解する:

あなたは、このように、文字列は、文字列を分割してJS-エンジンによって解析された後、メモリ内のどのように見えるかを確認することができますまた、この問題を回避する可能性(醜い)ソリューションを提供する:エスケープ・コンテキストが留意されていない場合

'file:///C:\funstuff\buildtools\viewer.html'.split('') 
//> 
["f", "i", "l", "e", ":", "/", "/", "/", "C", ":", "", "u", "n", "s", "t", "u", 
    "f", "f", "", "u", "i", "l", "d", "t", "o", "o", "l", "s", "", "i", "e", "w", 
    "e", "r", ".", "h", "t", "m", "l"] 

'file:///C:\funstuff\buildtools\viewer.html'.split('').map(function(e){ 
    return e.charCodeAt() 
}); 
//> 
[102, 105, 108, 101, 58, 47, 47, 47, 67, 58, 12, 117, 110, 115, 116, 117, 102, 
102, 8, 117, 105, 108, 100, 116, 111, 111, 108, 115, 11, 105, 101, 119, 101, 
114, 46, 104, 116, 109, 108] 
//>in Hex values by applying .toString(16) 
["66", "69", "6c", "65", "3a", "2f", "2f", "2f", "43", "3a", "c", "75", "6e", 
"73", "74", "75", "66", "66", "8", "75", "69", "6c", "64", "74", "6f", "6f", 
"6c", "73", "b", "69", "65", "77", "65", "72", "2e", "68", "74", "6d", "6c"] 

基本的に単一のバックスラッシュは、このように予期しない結果を生じさせる、次の文字をエスケープします。

策:ルックアップテーブルを介して

彼らは\x20-\x7Fの印刷可能なASCII文字の範囲外にある場合、あなたは多くの誤っエスケープ文字を復元することができます。たとえば、上記の例の場合、12または\x0c [12..toString(16)]は'\\'+'v'となります。

PS:は、情報の損失が発生したことに注意してください、とあなたは文字列が印刷可能なASCII範囲であるあなたのケースで意味を、contextual-またはメタ情報を介して情報を復元しようとしています。

すべての実装をコミュニティと共有してください。乾杯!それに `;

-1

< <エスケープ文字の交換>>あなたがHTMLにバックスラッシュを保存する場合

import java.util.Scanner; 

public class Example7 { 

    public static void main(String[] args) { 
    Scanner in=new Scanner(System.in); 
    System.out.println("Please enter a sentence: "); 
    String a=in.nextLine(); 
    //System.out.println("the word had enter: "+a); 

    String Str1 = a.replace("\\n", "(new_line)"); 
    //System.out.println(Str1); 
    String Str2 = Str1.replace("\\t", "(tab)"); 
    //System.out.println(Str2); 
    String Str3 = Str2.replace("\\t", "(tab)"); 
    String Str4 = Str3.replace("\\\\", "(comment_line)"); 
    String Str5 = Str4.replace(":)", "(smile) "); 
    System.out.println("The new sentence:" +Str5); 
    } 
} 
関連する問題