【发布时间】:2018-02-25 10:10:48
【问题描述】:
我正在开发 Visual Studio Code 扩展。该扩展应该作用于当前在编辑器窗口中选择的文本并将其发送到外部命令(在我的情况下为lein-cljfmt,但我认为这与我的问题无关)。当外部命令处理完文本后,我想用命令行工具返回的结果替换当前编辑器选择器。
在发送字符串之前,我这样转义它:
contents
.replace(/\\/g, '\\\\')
.replace(/"/g, '\\"')
.replace(/\n/g, '\\n');
未转义的结果如下:
contents
.replace(/\\n/g, '\n')
.replace(/\\"/g, '"')
.replace(/\\\\/g, '\\');
除了一种情况外,这在所有情况下都有效:当正在处理的选择包含包含换行文字的字符串文字时,取消转义会将其变成换行符,从而破坏编辑器中的代码。
这是一个打破我转义的 sn-p 示例:
(defn join
[a b]
(str a "\n" b))
我尝试了相当多的正则表达式黑魔法
.replace(/(?!\B"[^"]*)\\n(?![^"]*"\B)/g, '\n')
到目前为止,但找不到没有边缘情况的解决方案。有没有办法做到这一点,我错过了?我还想知道是否有一个 VSCode 扩展 API 可以处理这个问题,因为这对我来说似乎是一个常见的场景。
【问题讨论】:
-
用反引号将字符串括起来,而不是单引号或双引号
标签: javascript regex escaping visual-studio-code vscode-extensions