2010-07-26 21 views
47

quiero hacer esto:Vim expresiones regulares retrorreferencia

%s/shop_(*)/shop_\1 wp_\1/ 

¿Por qué no shop_(*) partido nada?

+0

Estoy un poco más cerca: '% s/shop _/& wp_ \ 1' – nnyby

+1

Si no entendí correctamente, intente agregar ejemplos. – Stephen

+5

Esta pregunta sería más útil para los futuros usuarios de SO si se agregara un ejemplo de lo que se intenta con la expresión regular. – LondonRob

Respuesta

7

Si he entendido bien, que desea %s/shop_\(.*\)/shop_\1 wp_\1/

Escapar del paréntesis de captura y el uso de .* para que coincida con cualquier número de cualquier carácter.

(Su búsqueda es la búsqueda de "shop_" seguido de cualquier número de abrir paréntesis, seguido de un paréntesis de cierre)

56

Hay varias cuestiones aquí.

  1. parens en regexen vim no son para capturar - es necesario utilizar \(\) para las capturas.

  2. * no significa lo que piensas. Significa "0 o más de los anteriores", por lo que su expresión regular significa "una cadena que contiene shop_ seguido de 0+ ( y luego un literal ).
    Está buscando ., que en expresiones regulares significa" cualquier carácter ". junto con una estrella como .* que significa "0 o más de cualquier carácter" Usted probablemente querrá al menos un carácter, a fin de utilizar .\+ (+ significa "1 o más de los anteriores")

Utilice esta.: %s/shop_\(.\+\)/shop_\1 wp_\1/.

Opcionalmente termínelo con g después de la barra final para reemplazar todas las instancias en una línea en lugar de solo la primera.

+0

Solo un comentario: la expresión regular existente no buscaba un literal '*)', solo un literal ')'. – Stephen

+0

@Stephen: Woops, tienes razón. Mistyped allí. – Daenyth

Cuestiones relacionadas