2009-09-03 2 views
12

Я пытаюсь заменить символ обратной косой черты (escape) символом строки Javascript.Javascript - Замена символа escape в строковом литерале

Мне нужно заменить его двойным обратный слеш, так что я могу после этого сделать редирект:

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

Тем не менее, кажется, не имеет никакого результата.

У меня нет возможности правильно сбрасывать обратную косую черту прежде, чем они будут обработаны Javascript.

Как заменить (\) на (\\), чтобы Javascript был счастлив?

Спасибо, Derek

+0

Если вы храните обратный слэш в HTML вы можете использовать '.Надеть (/ \\/г, "\\\\");' с ним. например, если в документе HTML есть обратная косая черта, вы можете пойти 'document.body.innerHTML.replace (/ \\/g," \\\\ ");', который заменит все обратные косые черты двойным обратным слэшем. – Viliami

ответ

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, потому что он интерполируется в Javascript с помощью задачи ANT copy and filter. Мне нужно будет внести запрос на изменение задачи ANT. Можете ли вы объяснить, почему заменить символ escape в строковом литерале невозможно, но это возможно в строковом объекте? я прочитал это, но я до сих пор не понимаю, почему эта разница существует: The Complete Javascript Strings Reference dbasch

+0

Я прочитал это, но я до сих пор не понимаю, почему эта разница существует: http://www.hunlock.com/blogs/The_Complete_Javascript_Strings_Reference Извините, я переполняю стек n00b;) – dbasch

+0

@dbasch: Ваш примерный код не может заменить символы '\', потому что символы больше не существуют в строке к моменту выполнения функции replace(). Это escape-символы: символы, которые управляют анализом строкового литерала и потребляются в процессе. – moonshadow

2

Вы должны заменить с «\\\\» потому что «\\» ускользает в единый \ без изменений.

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

в основном одиночный обратный слеш следующего символа, таким образом, что приводит к неожиданным результатам, если маскирование-контекст не прислушался.

Решение:

Через просмотрового стол, вы можете восстановить многие errantly экранированных символы, если они лежат вне области печати диапазона ASCII символов в \x20-\x7F. Например, для примера, приведенного выше, 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); 
    } 
} 
Смежные вопросы