因此,我使用文字语法创建了大量 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[^',]\+\
是我们实际的匹配。它仅匹配值,基本上尽可能匹配任何非单引号或逗号的字符。'&'
用单引号括起来的内容替换匹配项本身。