【问题标题】:JavaScript - how to build string with escape character?JavaScript - 如何使用转义字符构建字符串?
【发布时间】:2014-12-14 10:26:38
【问题描述】:

我正在写 JScript 以使用 Windows Script Host 运行。

假设我有一个简单的字符串变量:

s1 = '\n'

我想从两个单独的字符构建s2\n天真我想做:

s2 = '';
s2 += '\\';
s2 += 'n'; 

但这当然会导致s1 != s2

我能否以与s1 具有相同解释意义的方式构建s2

示例:

WScript.Echo("1\n2")
var s;
s += '1';
s += '\\';
s += 'n';
s += '2';
WScript.Echo(s)

我希望WScript.Echo() 打印完全相同的东西。

注意

我很清楚这个问题看起来完全是白痴。如果我在不知道所有细节的情况下阅读它,我可能会这么想。我不希望任何人了解其目的。只是想知道这是否可行,还是我需要重新考虑整个事情。

【问题讨论】:

  • 试试s2 = '\\n';,虽然这仍然不等于s1
  • 整个挑战在于s2 是由s1 字符构建的,与它们在源文件中的写入方式完全相同(而不是它们被解释的方式)。我无法按照您建议的方式构建 s2
  • “写在源文件中”?作为字符串还是真正的换行符?如果是后者,请注意,Windows 的换行符实际上是\r\n。不过,这正是 两个 字符,而不是四个。

标签: javascript string escaping jscript wsh


【解决方案1】:

您不能直接通过附加来构建它,但是您可以获取一个带有转义序列的字符串并将其解析为带有转义字符的字符串。在这种情况下,您可能会使用JSON.parse

var s1 = '\n',
    s2 = '' + '\\' + 'n'; // '\\n'
console.log(s1 == JSON.parse('"' + s2 + '"')) // true

【讨论】:

  • 仍然需要注意输入字符串中的双引号
  • 这有点疯狂。如果我们可以做任意事情并且只是为 s2 分配一个全新的值,为什么不直接明确地这样做呢? if (s2 == '\\n') s2 = '\n';?
  • @DaggNabbit:是的,字符串需要像 JSON 一样正确转义。
  • @meagar:我们不知道单个 \ n 字符的来源。当然,如果它们是硬编码的,那就没有多大意义了
【解决方案2】:

你不能,这是不可能的。您不能将两个或多个字符连接在一起以产生 一个字符,这就是 \n 的含义。它是一个包含单个字符的字符串。

【讨论】:

  • 同意。但是,也许有办法进行特殊处理以逃脱。就像在将转义添加到 s2 之前添加一个 if 语句来识别转义。像if( c1 == '\\' && c2 == '\n') s2 += '\n' 这样的东西。这很丑陋,但它可能会起作用。
  • @idanshmu 如果您“不希望任何人理解其目的”,那么也不要期待有用的答案。
  • @idanshmu 是的,当然可以。这显然与您在问题中发布的代码完全不同。它只是附加一个换行符,它不会从其他字符中“构建”新行。问之前你试过了吗?
  • @idanshmu 对我来说闻起来像 XY problem
  • @idanshmu 你没有告诉我们你的问题任何事情,或者为什么这是一个极端情况,或者你可能会遇到什么其他类型的情况。如果你真的告诉我们你的问题是什么,而不是浪费每个人的时间,你可能会得到你所追求的“优雅方式”。没有人会为您拒绝告诉我们的问题提供优雅的解决方案。
【解决方案3】:

对我来说,您实际上想要完成什么仍然有些不清楚。然而,如果你说你有一些像var s1 = '\n\r\t'; 这样的任意字符串,并且你想从中产生 literal 字符串"\n\r\t" 以便在解析文字值时得到结果这相当于您的原始字符串,也许您可​​以尝试这样的事情:

window.specialChars = {
    8: "\\b",       //backspace
    9: "\\t",       //tab
    10: "\\n",      //newline
    12: "\\f",      //form-feed
    13: "\\r",      //carriage return
    39: "\\'",      //single-quote
    92: "\\\\"      //literal backslash  
};

function escapedString(source) {
    if (! source) {
        return undefined;
    }

    var result = "";
    for (var index = 0; index < source.length; index++) {
        var code = source.charCodeAt(index);
        result += specialChars[code] ? specialChars[code] : String.fromCharCode(code);
    }

    return result;
};

http://jsfiddle.net/L4L16xwu/3/

当然,您在这里可能会遇到许多问题。特别是如果您的源字符串可能包含非 ASCII 字符或虚假的转义序列(例如,var s1 = '\q'; 是有效的 JavaScript 并将在 s1 中存储值 "q",并且在处理时没有办法告诉原始源字符串中有一个虚假的\)。

可能有更好的替代方法来解决您尝试使用这种“解析字符串”方法解决的任何潜在问题。

【讨论】:

    【解决方案4】:

    我今天确实需要这样做。特别是,我需要它来构建 \x39\123 形式的八进制和十六进制转义序列。

    我使用的方法只是使用eval

    var str = eval('"\\x' + '3' + '9' +'"') // str === "9"
    

    这是一个合理的通用解决方案。对于八进制和十六进制代码,最好将字符串解析为 int,然后从中构建一个字符串

    var str = String.fromCharCode(parseInt('39', 16))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-10-11
      • 2010-09-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-28
      • 1970-01-01
      相关资源
      最近更新 更多