【问题标题】:How to escape nested single quotes inside back tick or back quote如何在反引号或反引号内转义嵌套的单引号
【发布时间】:2020-05-29 08:24:31
【问题描述】:

假设我们在 ES6 中有以下模板字面量。

`'{"0": "It's Friday today"}'`

我们如何转义单词It's

中的单引号

另外,假设我们有以下模板文字:

`'{"0": "Thursday\nFriday"}'`

我们如何逃避上面的\n。

【问题讨论】:

  • 这可能会对您有所帮助:stackoverflow.com/questions/4253367/…
  • @T.J.Crowder 看起来 stackoverflow 没有在我上面提到的表达式的开头和结尾显示反勾号。我已经编辑了描述。仅供参考,前缀 \ 不起作用。
  • 你在做什么让你想在模板文字中定义字符串文字?
  • 既然问题已经澄清,我已经更新了我的答案。
  • 这是模板字符串中单引号字符串文字中 JSON 文本中的字符串吗?要回答这个问题,我们需要知道您要在什么级别进行转义。另外,是什么生成了这些字符串?

标签: javascript ecmascript-6 template-literals backticks backquote


【解决方案1】:

您不必转义它们中的任何一个,除非您想将模板文字的内容用作在某些时候用单引号引用的字符串文字。这看起来真的很可疑:永远不要手动创建 JSON 字符串(如果你这样做了,请不要将它包裹在模板文字中的字符串文字中!:-))。但是,如果您希望在模板文字中定义该字符串文字,这里是如何在字符串文字级别进行转义:

要在模板将定义的 string 文字中的 It's 中的 ' 转义,您需要在其前面放置一个反斜杠。但是因为反斜杠是模板文字中的转义,所以您需要对反斜杠进行转义,这样它就不会被模板文字消耗,并且稍后在评估字符串文字时使用。所以:

// Define the template literal:
const s1 = `'{"0": "It\\'s Friday today"}'`;
// Escaped backslash −^^
console.log(s1);

// Evaluate the single-quoted string literal it defined:
const s2 = eval("(" + s1 + ")");
console.log(s2);

// Since that defined a string containing JSON, let's parse it:
const obj = JSON.parse(s2);
console.log(obj[0]);

在\n 的第二个示例中,\n 转义序列在模板文字级别使用,这意味着模板文字包含换行符。但是从模板文字的角度来看,您希望它不是换行符,所以您...转义它:\\n。现在它不再是模板文字的换行符,而是单引号字符串文字。现在它与上面的It's 相同:如果您不希望单引号字符串文字消耗\n esape 序列,则需要对其进行转义。这意味着你最终会得到\\\\n:

// Define the template literal:
// 1st escaped backslash −−−vv
const s1 = `'{"0": "Thursday\\\\nFriday"}'`;
// 2nd escaped backslash −−−−−^^
console.log(s1);

// Evaluate the single-quoted string literal it defined:
const s2 = eval("(" + s1 + ")");
console.log(s2);

// Since that defined a string containing JSON, let's parse it:
const obj = JSON.parse(s2);
console.log(obj[0]);

【讨论】:

    【解决方案2】:

    我认为使用反引号是错误的, 你可以这样写:

    '\'{"0": "It\'s Friday today"}\''
    
    '\'{"0": "Thursday\nFriday"}\''
    

    无论如何,我认为这样做的整个目的过于复杂,如果您只想创建一个 json,只需创建一个对象,然后将其转换为 json:

    var obj1 = {0: "It's Friday today"};
    var obj2 = {0: "Thursday\nFriday"};
    
    var json1 =  JSON.stringify(obj1);
    var json2 =  JSON.stringify(obj2);
    
    var final1 = "'" + json1 + "'";
    var final2 = "'" + json2 + "'";
    

    这样更容易,语法错误的可能性也更小。

    希望对您有所帮助。

    【讨论】:

    • 道歉。看起来 stackoverflow 没有在我上面提到的表达式的开头和结尾显示反勾号。我已经编辑了描述。仅供参考,前缀 \ 不起作用。
    【解决方案3】:

    默认情况下,您不必转义它们。

    如果以后想解析,可以使用模板标签函数。

    模板标签函数接收未转义的字符串以允许进一步处理。

    String.raw 标记函数,例如,返回一个字符串而不解析额外的转义:

    console.log(String.raw `'{"0": "It\'s Friday today"}'`)
    //       A single \ will do it ---^-----v
    console.log(String.raw `'{"0": "Thursday\nFriday"}'`)

    【讨论】:

      【解决方案4】:

      1:使用 \'{"0": "It\'s Friday today"}' 2:再次使用\'{"0": "Thursday\\nFriday"}'

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-08-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-04-11
        • 1970-01-01
        • 2021-02-26
        • 1970-01-01
        相关资源
        最近更新 更多