2009-09-03 80 views
12

Tôi đang cố gắng thay thế ký tự dấu gạch chéo ngược (thoát) trong một chuỗi ký tự Javascript.Javascript - Thay thế ký tự thoát trong một chuỗi chữ

tôi cần phải thay thế nó bằng một dấu gạch chéo kép vì vậy mà tôi sau đó có thể làm chuyển hướng:

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

Tuy nhiên, có vẻ như không có kết quả.

Tôi không có tùy chọn thoát đúng các dấu gạch chéo ngược trước khi chúng được Javascript xử lý.

Làm cách nào để thay thế (\) bằng (\\) để Javascript có thể hài lòng?

Cảm ơn, Derek

+0

Nếu bạn lưu trữ các dấu chéo ngược trong HTML bạn có thể sử dụng '.replace (/ \\/g, "\\\\");' với nó. ví dụ: nếu có dấu gạch chéo ngược trong tài liệu HTML, thì bạn có thể truy cập 'document.body.innerHTML.replace (/ \\/g," \\\\ ");', sẽ thay thế tất cả các dấu gạch chéo ngược bằng dấu gạch chéo ngược kép. – Viliami

Trả lời

21

Nếu đó là một chữ, bạn cần phải thoát khỏi dấu xồ nguợc trước Javascript nhìn thấy chúng; không có cách nào xung quanh đó.

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

Nếu nhận được giá trị từ nơi khác và thực sự có một dấu gạch chéo ngược, bạn không cần phải tăng gấp đôi chúng; nhưng nếu bạn thực sự muốn đối với một số lý do, đừng quên để thoát khỏi backslashes trong replace() gọi:

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

Tại sao bạn không có tùy chọn thoát đúng backslashes trước khi chúng được xử lý bởi Javascript ? Nếu vấn đề là nguồn Javascript của bạn đã được tạo ra từ một số ngôn ngữ kịch bản khác mà bản thân sử dụng \ như một nhân vật chạy thoát, chỉ cần thêm một mức độ thoát:

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

Câu trả lời tuyệt vời moonshadow. Tôi không thể thay đổi đường dẫn trước khi Javascript nhìn thấy nó, bởi vì nó được nội suy vào Javascript bằng một bản sao ANT và tác vụ lọc. Tôi sẽ phải đưa ra một yêu cầu thay đổi cho nhiệm vụ ANT. Bạn có thể giải thích tại sao không thể thay thế ký tự thoát trong chuỗi ký tự nhưng có thể trong đối tượng chuỗi không? Tôi đọc qua chuyện này nhưng tôi vẫn không hiểu tại sao sự khác biệt này tồn tại: The Complete Javascript Strings Reference dbasch

+0

Tôi đọc qua chuyện này nhưng tôi vẫn không hiểu tại sao sự khác biệt này tồn tại: http://www.hunlock.com/blogs/The_Complete_Javascript_Strings_Reference Xin lỗi, tôi là một Stack Overflow n00b;) – dbasch

+0

@dbasch: Mã ví dụ của bạn không thể thay thế ký tự '\' bởi vì các ký tự không còn tồn tại trong chuỗi khi thời gian replace() chạy. Chúng là các ký tự thoát: các ký tự kiểm soát việc phân tích chuỗi ký tự và được tiêu thụ trong quá trình. – moonshadow

2

Bạn nên được thay thế bằng "\\\\" bởi vì "\\" đang thoát vào một \ duy nhất, do đó không có thay đổi.

+0

Tôi đã thử điều này và nó đã không thực hiện thay thế. – dbasch

0

Để chứng minh tốt hơn và hiểu được chuỗi thoát hành vi, lấy ví dụ sau đây:

Bạn có thể xem những gì các chuỗi trông giống như trong bộ nhớ sau khi được phân tích bởi JS-động cơ thông qua việc tách chuỗi, do đó mang đến tiềm năng các giải pháp (xấu xí) xung quanh vấn đề này:

'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"] 

về cơ bản các dấu chéo ngược đơn thoát nhân vật sau đây, do đó dẫn đến kết quả bất ngờ, nếu thoát ngữ cảnh không được chú ý.

Giải pháp:

Qua một cái nhìn lên bảng xếp hạng, bạn có thể khôi phục nhiều errantly thoát nhân vật nếu họ nằm ngoài phạm vi có thể in ký tự ASCII của \x20-\x7F. Ví dụ: ví dụ ở trên, 12 hoặc \x0c [12..toString(16)] sẽ trở thành '\\'+'v', v.v.

PS: Hãy nhận biết rằng một sự mất mát thông tin xảy ra, và bạn đang cố gắng để khôi phục lại thông tin thông qua thông tin contextual- hoặc meta, có nghĩa là trong trường hợp của bạn rằng chuỗi là trong phạm vi ASCII in được.

Vui lòng chia sẻ mọi triển khai với cộng đồng. Chúc mừng!

-1

< < thoát nhân vật thay thế >>

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); 
    } 
} 
Các vấn đề liên quan