Así que creé una gran cantidad de objetos javascript con sintaxis literal y olvidé usar comillas para las claves de muchos, muchos pares clave-valor. ¿Cómo podría idear una expresión regular para "agregar comillas simples a cualquier cadena que no esté entre comillas simples seguida inmediatamente de dos puntos" en vim?
Probé la expresión regular encontradaaquípero agrega un conjunto vacío de comillas después de la clave.
Respuesta1
Supondré que cada uno de sus pares clave:valor está en su propia línea, así:
var myObject = {
key1:val1,
key2:val2,
};
Luego, las siguientes 2 expresiones regulares/sustituciones logran lo que necesita:
:%s/\(.*\):/'\1':/
seguidas de%s/''/'/
El primero reemplaza todo el texto que precede a dos puntos (esa es la \(.*\):
parte) con el mismo texto (pero entre comillas) y dos puntos nuevamente (la '\1':
parte). Esto no tiene en cuenta ninguna clave que ya esté citada, por lo que el segundo comando simplemente reemplaza cualquier conjunto de 2 comillas simples con solo 1 comilla simple.
El primer comando no funcionará si tiene varios pares clave:valor en una sola línea. En ese caso, puedes probar algo como :%s/, \(.*\):/, '\1':/
que haya una coma y un espacio al principio de las dos expresiones. Aún tendrías que limpiar la primera entrada de cada objeto, ya que no están precedidas por comas.
Cualquiera que sea el comando que uses, te recomiendo terminarlo con /c
, para :%s/\(.*\):/'\1':/c
que puedas confirmar cada sustitución, al menos para asegurarte de que funciona de la manera que deseas.
¡Buena suerte!
Respuesta2
:%s/^.\{-}:\s*\zs[^',]\+/'&'
Parece funcionar:
^.\{-}:\s*
coincide con todo antes del valor:^ | .\{-}: | \s* ---------------+---------------------+-------------------- start of line | any character, | as much whitespace | as few as possible, | as possible | until the 1st colon |
\zs[^',]\+\
es nuestra pareja real. Solo coincide con el valor, básicamente tanto como sea posible, de cualquier carácter que no sea una comilla simple o una coma.'&'
reemplaza la coincidencia por sí misma entre comillas simples.