【问题标题】:How do I Programmatically create a double escape?如何以编程方式创建双重转义?
【发布时间】:2015-02-11 00:21:01
【问题描述】:

我有一个带有转义字符的字符串:

var a = "Hello\ World";

我想将字符串拆分成一个字符数组,其中包含转义字符:

var a = "Hello\ World";
/* Do something here */
a; // I want output: ["H","e","l","l","o","\"," ","W","o","r","l","d"]

通常我使用以下方法拆分字符串:

a=a.split('');

但这当然行不通,因为在拆分过程中会忽略转义字符。

var a = "Hello\ World";
a=a.split('');
a; // outputs ["H","e","l","l","o"," ","W","o","r","l","d"]

现在我知道为了得到我想要的结果,我必须使用双重转义。我知道我的字符串应该是这样的:

var a = "Hello\\ World";

但这不是我拥有的字符串,我没有手动输入它生成的字符串。所以我完全理解我需要双重转义,但我不能手动创建一个。我需要知道如何以编程方式将"Hello\ World" 转换为"Hello\\ World"

是否有一些神奇的功能可以避开所有反斜杠?是否有我不知道的doubleEscape() 函数,或者可能有一些正则表达式替换函数可以帮助我。

我不想要“使用双重转义”或“您的字符串必须是 'Hello\ World'”的答案。我完全知道这是我需要做的,但我需要以编程方式转义转义字符,它不能手动完成。

我尝试过这样的事情:

var a = "Hello\ World";
a = a.replace("\", "\\");

但这当然不起作用,因为在替换过程中会忽略转义字符。我试过这样的事情:

var a = "Hello\ World";
a = a.replace("\\", "\\\\");

但这给出了一个错误。我相信它将搜索参数解释为正则表达式,这是一个无效的正则表达式,这会导致错误。

另一篇类似的帖子建议这样做:

var a = "Hello\ World";
a = a.replace(/\\/g, '\\\\');
a; // outputs "Hello World";

这不起作用。字符串保持不变,就好像没有执行替换一样。

有什么建议吗?

【问题讨论】:

  • '\ ' 等价于' ',这意味着以编程方式你所拥有的完全等价于'Hello World',并且绝对无法知道 `` 字符在字符串中的位置 (除非您解析该特定字符串的源代码)。
  • 是的,我看到了 4 次这样的答案,但我离真正的答案还差得远。
  • 我投票结束这个问题,因为它是基于一个谬误和根本的误解
  • @DustinPoissant 没有真正的答案。您的问题完全无法回答。

标签: javascript regex string


【解决方案1】:

不,你不能。并不是split中的反斜杠被忽略了。

相反,问题在于反斜杠不在字符串中

"Hello\ World"; // "Hello World"

因此,一旦字符串文字被解析,就无法恢复斜线。

然而,ECMAScript 6 引入了template strings。并且使用String.raw,您可以恢复原始字符串形式:

`Hello\ World`;           //  "Hello World"
String.raw`Hello\ World`; //  "Hello\ World"

【讨论】:

  • 我没有原始字符串。我有一个普通的。我如何将a 转换为原始字符串?
  • @DustinPoissant 如果您使用` 代替引号,您将有一个模板字符串。
  • 字符串作为参数传递给函数。 Sense javascript 不允许我指定参数类型,我不能强制调用者传入原始字符串。
  • @DustinPoissant 你的问题毫无意义。您是否拥有代码var a = "Hello\ World" 的字面意思是sn-p,还是没有?如果您想要答案,这实际上很重要。该字符串不可能只是“传入”到您的函数中,因为该字符串不可能存在于源代码之外。字符串不是"Hello\ World",字符串是"Hello World"。反斜杠存在于源代码中。
  • 所以你告诉我不可能打电话给func("Hello\ World"),因为我很确定我可以大声笑。我 100% 确信我可以毫无问题地将 Hello\ World 传递给一个函数,那么问题就出在函数内部,确定转义字符的使用位置。这就是我想要的。这个问题并不愚蠢,但 JavaScript 可能无法满足我的要求。我要求检测转义字符的使用位置,如果 JavaScript 不能做到这一点而不是这样说,但是当它是一个完全合法的问题时,不要试图告诉我这是一个愚蠢的问题。
【解决方案2】:

我试过这个方法: 我运行了您的代码和变体。为了解决逃避反弹的问题,我想通过测试 CharCode 自己制作函数。 正如预期的那样,函数输出为 index=5。

function f(x) {
    var a = -1,i,n=x.length;
    for(i=0;i<n;i++)
    {
        if(x.charAt(i)==String.fromCharCode(92))
        {
            a=i;
            break;
        }
    }
    return a.toString();
}

function h(x) {
    document.getElementById('in').innerHTML = x;
    document.getElementById('out').innerHTML = f(x);
}

<button type="button"
onclick="h('Hello\\ World')">
Run</button>

<p id="in"></p>
<hr>
<p id="out"></p>

【讨论】:

  • 再次将它传递给已经双重转义的函数。您是否阅读了整个问题?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-10
  • 2013-11-15
  • 2013-12-28
  • 2011-02-10
  • 2011-04-02
  • 2012-02-26
相关资源
最近更新 更多