如何正确地转义和取消包含换行文字的多行字符串?

时间:2017-09-16 10:16:18

标签: javascript regex escaping visual-studio-code vscode-extensions

我正在开发Visual Studio Code扩展。扩展应该作用于当前在编辑器窗口中选择的文本,并将其发送到外部命令(lein-cljfmt,但我认为这与我的问题无关)。当外部命令完成后,处理我想要用命令行工具返回的结果替换当前编辑器选择器的文本。

在发送字符串之前,我将其转义为:

contents
    .replace(/\\/g, '\\\\')
    .replace(/"/g, '\\"')
    .replace(/\n/g, '\\n');

未转义的结果如下:

contents
    .replace(/\\n/g, '\n')
    .replace(/\\"/g, '"')
    .replace(/\\\\/g, '\\');

这适用于除一种情况之外的所有情况:当正在处理的选择包含包含换行文字的字符串文字时,unescaping会将其转换为换行符,从而破坏编辑器中的代码。

这是一个破坏我逃避的片段示例:

(defn join
  [a b]
  (str a "\n" b)) 

我尝试了一些正常的黑色魔法,如

.replace(/(?!\B"[^"]*)\\n(?![^"]*"\B)/g, '\n')

到现在为止,但找不到没有边缘情况的解决方案。有没有办法做到这一点,我失踪了?我也想知道是否有一个可以处理的VSCode扩展API,因为它似乎是我常见的场景。

1 个答案:

答案 0 :(得分:1)

我认为这可能就是你所需要的:

\n

试图在3个阶段中取消字符串非常棘手,因为\n具有不同的含义,具体取决于它之前的斜线数量。在您的示例中,原始字符串\\n(斜杠n)被编码为class ScrollViewController: UIViewController { @IBOutlet weak var scrollView: UIScrollView! override func viewDidLoad() { super.viewDidLoad() let profilView = self.storyboard?.instantiateViewController(withIdentifier: "profilController") as! UIViewController self.addChildViewController(profilView) self.scrollView.addSubview(profilView.view) profilView.didMove(toParentViewController: self) profilView.view.frame = scrollView.bounds let testViewTwo = self.storyboard?.instantiateViewController(withIdentifier: "chatController") as! UIViewController self.addChildViewController(testViewTwo) self.scrollView.addSubview(testViewTwo.view) testViewTwo.didMove(toParentViewController: self) testViewTwo.view.frame = scrollView.bounds var frame:CGRect = testViewTwo.view.frame frame.origin.x = self.view.frame.width testViewTwo.view.frame = frame self.scrollView.contentSize = CGSize(width: self.view.frame.width * 2, height: self.view.frame.height) //startposition //self.scrollView.contentOffset = CGPoint(x: (self.view.frame.width) * 1, y: self.view.frame.height) } (斜杠斜杠n),然后当您解码时,最后两个字符与您的第一个RegExps匹配时,您想要的是对于匹配第三个RegExp的前两个字符。你必须要计算斜线才能确定。一次性完成所有操作可以通过同时解码这些前导斜杠来解决这个问题。