【问题标题】:Why can't String.raw end with a backslash?为什么 String.raw 不能以反斜杠结尾?
【发布时间】:2020-08-08 12:39:39
【问题描述】:

String.raw 可用于创建包含反斜杠的字符串,而无需将这些反斜杠加倍。

从历史上看,创建字符串时需要将反斜杠加倍:

let str = "C:\\Program Files\\7-Zip";
console.log(str);

String.raw 允许您的代码在没有双反斜杠的情况下显示路径:

let str = String.raw`C:\Program Files\7-Zip`;
console.log(str);

上面的代码可以正常工作,但是今天发现如果原始字符串以反斜杠结尾就不行了:

let str = String.raw`Can't End Raw With Backslash\`;
console.log(str);

上面的 sn -p 会产生这个错误:

{
  "message": "SyntaxError: `` literal not terminated before end of script",
  "filename": "https://stacksnippets.net/js",
  "lineno": 14,
  "colno": 4
}

为什么这是一个例外?

【问题讨论】:

    标签: javascript node.js ecmascript-next template-literals


    【解决方案1】:

    可以,但请记住有“文字”字符和反斜杠字符。您要求的是 literal 反引号。要求文字反斜杠:

    let str = String.raw`...\\`;
    

    反斜杠后面的任何字符都被视为其文字版本,无论它是什么。 String.raw 可以解决其中的一些限制,但不是全部。它抑制了 \n 之类的插值,但不能防止您意外添加文字反引号。

    【讨论】:

    • 我猜这是String.raw 无法克服的低级解析器包袱。谢谢你的解释。
    • 我认为这是故意的。你怎么能在字符串中加一个反引号?
    • 是的,我明白你的意思了。这是一个耻辱;直到现在,我认为我已经找到了不必加倍这些反斜杠的完美解决方案。太糟糕了,它带有一个陷阱。
    • 这似乎不是一个正确的解决方案。 String.raw`...\\` 给了我"...\\\\",而不是"...\\"
    • 我在之前的评论中跳过了一个合乎逻辑的步骤——OP 的问题是关于如何创建一个以 single 反斜杠结尾的字符串。您的回答确实表明 String.raw 可用于创建以 两个 反斜杠结尾的字符串,但乍一看,您似乎是在说尾随反斜杠可以转义为 \\,所以String.raw`...\\` 将创建一个以一个反斜杠结尾的字符串。但事实并非如此,事实上,据我所知,似乎没有任何方法可以用 String.raw 做到这一点......除了String.raw`...${"\\"}`
    【解决方案2】:

    结尾 \` 总是被解析为转义的 ` 符号,这意味着模板文字没有匹配的结束反引号。这使得反斜杠如何与 String.raw 一起使用变得不太一致。

    对于更特殊的情况,可以根据需要在字符串中填充不希望出现在结果字符串中的字符。

    可以是换行符:

    const trimmedLine = (...args) => String.raw(...args).replace(/^(?:\r?\n|)([\s\S]*?)(?:\r?\n|)$/, '$1')
    
    // "C:\Program Files\7-Zip\"
    trimmedLine`
    C:\Program Files\7-Zip\
    `
    

    一个空格:

    const trimmedSpace = (...args) => String.raw(...args).replace(/^([\s\S]*?) ?$/, '$1')
    
    trimmedSpace`C:\Program Files\7-Zip\ `  // "C:\Program Files\7-Zip\" with no space
    trimmedSpace`C:\Program Files\7-Zip\  ` // "C:\Program Files\7-Zip\ " with 1 space
    

    等等。

    即使不应该修剪字符串,帮助程序也可以通过删除恰好一个空白字符来覆盖它,因此可以添加额外的一个以呈现在结果字符串中。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-10-13
      • 2021-09-03
      • 1970-01-01
      • 2021-11-16
      • 2019-01-28
      • 1970-01-01
      相关资源
      最近更新 更多