Então, criei um grande número de objetos javascript com sintaxe literal e esqueci de usar aspas para as chaves de muitos pares de valores-chave. Como eu criaria um regex para "adicionar aspas simples a qualquer string sem aspas simples seguida imediatamente por dois pontos" no vim?
Eu tentei o regex encontradoaquimas acrescenta um conjunto vazio de aspas após a chave.
Responder1
Suponho que cada um dos seus pares chave:valor esteja em sua própria linha, assim:
var myObject = {
key1:val1,
key2:val2,
};
Em seguida, as 2 regex/substituições a seguir realizam o que você precisa:
:%s/\(.*\):/'\1':/
seguido por%s/''/'/
O primeiro substitui todo o texto que precede dois pontos (essa é a \(.*\):
parte) pelo mesmo texto (mas entre aspas) e os dois pontos novamente (a '\1':
parte). Isso não leva em consideração nenhuma chave que já esteja entre aspas, então o segundo comando simplesmente substitui qualquer conjunto de 2 aspas simples por apenas 1 aspa simples.
O primeiro comando não funcionará se você tiver vários pares chave:valor em uma única linha. Nesse caso, você pode tentar algo como :%s/, \(.*\):/, '\1':/
onde há uma vírgula e um espaço no início das duas expressões. Você ainda teria que limpar a primeira entrada de cada objeto, já que elas não são precedidas de vírgulas.
Qualquer que seja o comando que você usar, recomendo finalizá-lo com /c
, para :%s/\(.*\):/'\1':/c
que você possa confirmar cada substituição, pelo menos para ter certeza de que funciona da maneira desejada.
Boa sorte!
Responder2
:%s/^.\{-}:\s*\zs[^',]\+/'&'
parece funcionar:
^.\{-}:\s*
corresponde a tudo antes do valor:^ | .\{-}: | \s* ---------------+---------------------+-------------------- start of line | any character, | as much whitespace | as few as possible, | as possible | until the 1st colon |
\zs[^',]\+\
é o nosso par real. Ele corresponde apenas ao valor, basicamente, tanto quanto possível, de qualquer caractere que não seja uma aspa simples ou vírgula.'&'
substitui a correspondência por si só entre aspas simples.