我正在开发一款Visual Studio Code扩展。该扩展应该对当前编辑器窗口中选定的文本进行操作,并将其发送到外部命令(在我的情况下是
在发送字符串之前,我会像这样对其进行转义:
结果没有被转义,如下所示:
我尝试了一些正则表达式黑魔法,例如
lein-cljfmt
,但我认为这与我的问题无关)。当外部命令处理完文本后,我想用从命令行工具返回的结果替换当前编辑器选择器。在发送字符串之前,我会像这样对其进行转义:
contents
.replace(/\\/g, '\\\\')
.replace(/"/g, '\\"')
.replace(/\n/g, '\\n');
结果没有被转义,如下所示:
contents
.replace(/\\n/g, '\n')
.replace(/\\"/g, '"')
.replace(/\\\\/g, '\\');
这在除了一种情况以外都能正常工作:当正在处理的选择包含一个包含换行符文本的字符串字面量时,反转义将会把其转换为换行符,从而在编辑器中导致程序出错。
以下是一个会使我的转义出错的代码片段示例:
(defn join
[a b]
(str a "\n" b))
我尝试了一些正则表达式黑魔法,例如
.replace(/(?!\B"[^"]*)\\n(?![^"]*"\B)/g, '\n')
到目前为止,我还没有找到一种没有边缘情况的解决方案。我是否遗漏了某种方法?我还想知道是否有VSCode扩展API可以处理这个问题,因为它对我来说似乎是一个常见的情况。