在 vim 中为大量单词添加引号

在 vim 中为大量单词添加引号

因此,我使用文字语法创建了大量 javascript 对象,并且忘记对许多键值对的键使用引号。我该如何设计一个正则表达式来在 vim 中“将单引号添加到任何非单引号字符串,后面紧跟一个冒号”?

我尝试了正则表达式这里但它在键后面附加了一组空引号。

答案1

我假设您的每个键:值对都在其自己的行上,如下所示:

var myObject = {
key1:val1,
key2:val2,
};

然后以下 2 个正则表达式/替换即可完成您的需要: :%s/\(.*\):/'\1':/其次是%s/''/'/

第一个命令将冒号(即部分\(.*\):)前面的所有文本替换为相同的文本(但用引号括起来),然后再次替换冒号(即部分'\1':)。这不会考虑任何已加引号的键,因此第二个命令只是将任何一组 2 个单引号替换为 1 个单引号。

如果一行中有多个键值对,则第一个命令将不起作用。在这种情况下,您可以尝试:%s/, \(.*\):/, '\1':/在两个表达式的开头添加逗号和空格。您仍然需要清理每个对象中的第一个条目,因为它们前面没有逗号。

无论您使用什么命令,我建议以 结尾/c,这样:%s/\(.*\):/'\1':/c您就可以确认每次替换,至少确保它按照您想要的方式工作。

祝你好运!

答案2

:%s/^.\{-}:\s*\zs[^',]\+/'&'

似乎可以解决问题:

  • ^.\{-}:\s*匹配值之前的所有内容:

     ^             | .\{-}:              | \s*
    ---------------+---------------------+--------------------
     start of line | any character,      | as much whitespace
                   | as few as possible, | as possible
                   | until the 1st colon |
    
  • \zs[^',]\+\是我们实际的匹配。它仅匹配值,基本上尽可能匹配任何非单引号或逗号的字符。

  • '&'用单引号括起来的内容替换匹配项本身。

相关内容