Javascript - Замена символа escape в строковом литерале

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

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

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

Однако, похоже, он не имеет результата.

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

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

Спасибо, Дерек

Ответ 1

Если это буквальный, вам нужно избежать обратных косых черт, прежде чем Javascript увидит их; это не так.

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

Если newpath получает свое значение из другого места и действительно содержит одиночные обратные косые черты, вам не нужно их удваивать; но если вы действительно хотели по какой-то причине, не забывайте избегать обратных косых черт в вызове replace():

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

Почему у вас нет возможности правильно избегать обратных косых черт, прежде чем они будут обрабатываться Javascript? Если проблема в том, что ваш источник Javascript генерируется с помощью другого языка сценариев, который сам использует\в качестве escape-символа, просто добавьте уровень экранирования:

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

Ответ 2

Вы должны заменить на "\\\\", потому что "\\" выходит в одно единственное\без изменений.

Ответ 3

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

Вы можете видеть, как выглядит строка в памяти после анализа 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"]

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

Решение:

С помощью справочной таблицы вы можете восстановить много ошибочно экранированных символов, если они лежат вне диапазона символов ASCII для печати \x20-\x7F. Например, для примера выше, 12 или \x0c [12..toString(16)] станет '\\'+'v' и т.д.

PS: Имейте в виду, что произошла потеря информации, и вы пытаетесь восстановить информацию посредством контекстной или метаинформации, что означает, что строка находится в печатном диапазоне ASCII.

Пожалуйста, поделитесь любыми реализациями с сообществом. Ура!

Ответ 4

< < Замена замены героев →

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