Итак, я создал большое количество объектов 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[^',]\+\
наше фактическое совпадение. Оно только соответствует значению, в основном, как можно большему количеству любого символа, который не является одинарной кавычкой или запятой.'&'
заменяет совпадение самим собой, заключенным в одинарные кавычки.