Javascript - 替换字符串中的转义字符

发布于 2024-08-04 08:54:05 字数 326 浏览 4 评论 0原文

我正在尝试替换 Javascript 字符串文字中的反斜杠(转义)字符。

我需要用双反斜杠替换它,以便我可以进行重定向:

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

但是,它似乎没有结果。

在 Javascript 处理反斜杠之前,我无法正确转义它们。

如何用 (\\) 替换 (\) 以便 Javascript 满意?

谢谢, 德里克

I am trying to replace the backslash (escape) character in a Javascript string literal.

I need to replace it with a double backslash so that I can then do a redirect:

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

However, it seems to have no result.

I don't have the option of properly escaping the backslashes before they are handled by Javascript.

How can I replace (\) with (\\) so that Javascript will be happy?

Thanks,
Derek

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

层林尽染 2024-08-11 08:54:05

如果它是一个文字,则需要在 Javascript 看到反斜杠之前转义它们;没有办法解决这个问题。

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

如果 newpath 从其他地方获取其值,并且确实包含单个反斜杠,则不需要将它们加倍;但如果出于某种原因你确实想要这样做,请不要忘记在replace()调用中转义反斜杠:

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

为什么在Javascript处理反斜杠之前你没有选择正确转义反斜杠?如果问题是您的 Javascript 源代码是从其他脚本语言生成的,而该语言本身使用 \ 作为转义字符,则只需添加转义级别:

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

If it's a literal, you need to escape the backslashes before Javascript sees them; there's no way around that.

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

If newpath is getting its value from somewhere else, and really does contain single backslashes, you don't need to double them up; but if you really wanted to for some reason, don't forget to escape the backslashes in the replace() call:

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

Why do you not have the option of properly escaping the backslashes before they are handled by Javascript? If the problem is that your Javascript source is being generated from some other scripting language that itself uses \ as an escape character, just add a level of escaping:

var newpath = 'file:///C:\\\\funstuff\\\\buildtools\\\\viewer.html';
╰◇生如夏花灿烂 2024-08-11 08:54:05

您应该替换为“\\\\”,因为“\\”转义为单个 \,因此没有变化。

You should be replacing with "\\\\" because "\\" is escaping into a single \ thus no change.

驱逐舰岛风号 2024-08-11 08:54:05

为了更好地演示和理解字符串转义行为,请看以下示例:

通过分割字符串,您可以看到 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 范围。

请与社区分享任何实现。干杯!

To better demonstrate and understand the string-escaping behavior, take the following example:

You can see what the string looks like in memory after being parsed by the JS-engine by splitting the string, thus also offering potential (ugly) solutions around this issue:

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

Basically the single backslash escapes the following character, thus giving rise to unexpected results, if the escaping-context is not heeded.

Solution:

Through a look-up-table, you can restore many errantly escaped characters if they lie outside the printable ASCII character range of \x20-\x7F. For the example above for instance, 12 or \x0c [ 12..toString(16) ] would become '\\'+'v', and so on.

PS: Be aware that a loss of information occured, and you are trying to restore information through contextual- or meta- information, meaning in your case that the string is in the printable ASCII range.

Please share any implementations with the community. Cheers!

澉约 2024-08-11 08:54:05

<<转义字符替换>>

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

<< Escape Characters Replacement>>

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);
  }
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文