【问题标题】:Preserve all backslashes in a string保留字符串中的所有反斜杠
【发布时间】:2020-11-21 01:57:22
【问题描述】:

我有一个包含反斜杠的字符串:

"{ \time 4/4 \key c \major d'4 }"

当我尝试在 nodejs child_process 中传递它或只是为了 console.log 它时, 反斜杠被删除:

console.log("{ \time 4/4 \key c \major d'4 }");   
// "{   ime 4/4 key c major d'4 }"

我已经尝试了所有能找到的方法,例如 .replace(/\\/g, '\\')JSON.stringify,但似乎没有任何效果。

字符串是动态构造的,所以我无法手动转义。

有什么想法吗?


cmets 后更新:

我使用node-python从一个用python (python-mingus) 编写的库中获取这个字符串。

据我从答案和 cmets 中了解到,如果不更改库或包装器,就无法正确解析字符串...

谢谢大家。

【问题讨论】:

  • "{ \\time 4/4 \\key c \\major d'4 }" 工作正常。您需要在 将数据放入 javascript 之前转义。你从哪里得到的?
  • “动态构造”到底是怎么回事,为什么会有斜线?如果它是字符串文字,则斜杠可能已被解析器删除。
  • 二字串文字\m 只表示一字串值。 JavaScript 只能作用于字符串值,而不是字符串文字。您不妨要求在数字文字10e2 中保留e。你不能;该文字表示值1000,并且该值没有e。同样,文字\m 表示值m,并且该值没有反斜杠。
  • 如果文字不正确,您将无法修复字符串。斜杠被视为转义序列,并且在它成为内存中的值时已经被丢弃。您必须修复“动态构造”。
  • 希望反斜杠并不重要,因为在 javascript 解析器消化它们时它们已经消失了。

标签: javascript


【解决方案1】:

您可以使用 String.raw 作为替代方法来保存包含斜杠的字符串; 对于他,您必须将字符串放在严重符号(`)之间,如下所示:

var path = String.raw`your\string\with\slash`;

这样你可以保留斜线。

【讨论】:

    【解决方案2】:

    不,您的字符串不包含(文字)反斜杠。

    \ 是转义字符,\t\k\m在解析时被视为转义序列(而不是在打印时,如你似乎认为)。他们甚至永远不会到达您的replace,因为当它运行时他们已经不存在了。此外,对于无法识别的序列(\k\m),反斜杠将被忽略。

    防止这种情况的唯一方法是在源代码中添加一个额外的反斜杠

    "{ \\time 4/4 \\key c \\major d'4 }"
    

    【讨论】:

      【解决方案3】:

      有趣的是,如果您在 HTML 文本输入框中键入字符 $$ \sum \theta $$,javascript 会拾取它们并将它们原封不动地传递,甚至 console.log 也会原封不动地打印出来。

      var TextSource = document.getElementById( "myHTMLTextInputBox" );
      var labelStr = TextSource.value;
      console.log ("Obtained text = ", labelStr);
      

      同样,您可以将相同的字符序列输入到 HTML DIV 的定义中,如下所示:-

      <div id="anne" name="bob" class="carla" title ="tommy"> $$ \sum \theta $$ </div>    
      

      (我想知道这些过程在解析方面是如何解释的?)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-02-27
        • 1970-01-01
        相关资源
        最近更新 更多