2009-09-03 69 views
12

我試圖在Javascript字符串文字中替換反斜線(轉義)字符。Javascript - 替換字符串文字中的轉義字符

我需要用一個雙反斜線來代替它,這樣我可以再做一次重新定位:

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

但是,它似乎沒有結果。

我沒有選擇在Javascript處理它們之前正確地轉義反斜槓。

如何用(\\)替換(\),以便Javascript會很開心?

感謝, 德里克

+0

如果存儲反斜線HTML,你可以用'.replace(/ \\ /克, 「\\\\」);'它。例如,如果在HTML文檔中存在反斜線,那麼你可以去'document.body.innerHTML.replace(/ \\/g,「\\\\」);',它將用雙反斜槓替換所有反斜槓。 – Viliami 2016-11-30 21:59:50

回答

21

如果它是一個文字,你需要躲避反斜線的Javascript看到他們前;這是沒有辦法的。

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

如果newpath是從別的地方得到它的價值,並且確實含有單反斜線,你並不需要他們加倍;但如果你真的想出於某種原因,不要忘了逃跑的反斜槓替換()調用:

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

爲什麼你沒有正確地轉義反斜線選擇將他們通過使用Javascript處理前?如果問題是正在從本身使用\作爲轉義字符一些其他腳本語言生成你的Javascript源,只需添加逃逸的水平:

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

很好的答案moonshadow。 我不能在Javascript看到它之前更改路徑,因爲它通過ANT副本和過濾器任務插入到Javascript中。我將不得不提出ANT任務的更改請求。 你能解釋爲什麼不可能替換字符串文字中的轉義字符,但它可能在字符串對象中? 我通過這次讀書,但是我還是不明白爲什麼這存在差異: The Complete Javascript Strings Reference dbasch 2009-09-04 00:59:03

+0

我通過這次讀書,但是我還是不明白爲什麼這存在差異: http://www.hunlock.com/blogs/The_Complete_Javascript_Strings_Reference 對不起,我是堆棧溢出n00b;) – dbasch 2009-09-04 01:00:58

+0

@dbasch:您的示例代碼無法替換'\'字符,因爲字符在replace()運行時不再存在。它們是轉義字符:控制字符串文本解析並在進程中被使用的字符。 – moonshadow 2009-09-04 07:16:37

2

你應該「\\\\」被取代因爲「\\」正在轉化爲單個\因此沒有改變。

+0

我試過了,它沒有做出替換。 – dbasch 2009-09-04 05:24:04

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:要知道,信息丟失發生,而你試圖通過contextual-或元信息來恢復信息,你的情況,該字符串是可打印的ASCII範圍含義。

請與社區分享任何實施。乾杯!

-1

< <轉義字符替換>>

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); 
    } 
}