因此,我使用文字語法創建了大量的 javascript 對象,並且忘記對許多鍵值對的鍵使用引號。我該如何設計一個正規表示式來「在vim中向任何非單引號字串添加單引號,後面跟著冒號」?
我嘗試了正規表示式發現這裡但它在鍵後面附加了一組空引號。
答案1
我假設你的每個鍵:值對都在自己的行上,如下所示:
var myObject = {
key1:val1,
key2:val2,
};
:%s/\(.*\):/'\1':/
然後以下 2 個正規表示式/替換即可完成您的需求:
%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[^',]\+\
是我們真正的比賽。它只匹配值,基本上盡可能匹配非單引號或逗號的任何字元。'&'
將匹配項替換為單引號括起來的匹配項本身。