2012-01-18 11 views
9

Quiero hacer coincidir un patrón, reemplazar parte del patrón y usar una variable dentro del patrón como parte de la cadena de reemplazo.Regex: ¿Cómo reemplazo parte de un patrón y hago referencia a una variable dentro de él?

¿Es esto correcto?

/s/^((\s+)private\sfunction\s__construct\(\))/(2)def\s__init__

En Inglés: reemplazar cualquier cantidad de espacio en blanco seguido de la cadena "private function __construct()" con la misma cantidad de espacio en blanco y la cadena . Entonces, ¿mi expresión regular es mala o qué?

partial replace

+1

¿En qué idioma/aplicación está utilizando esto? (No es el idioma en el que están sus datos. El que está ejecutando la expresión). – FakeRainBrigand

+0

@FakeRainBrigand 'Vi'. –

Respuesta

6

Esto se llama una referencia hacia atrás, y se utiliza para referirse a \i el grupo capturado i'th del patrón.

Así que para el patrón ^((\s+)private\sfunction\s__construct\(\)), el reemplazo es \2def __init__.

+0

Bien, pero aquí hay otro ejemplo: ': s/^ ((\ s +) $ this ->). * $/\ 2self. /'. Como puede ver, estoy buscando '^ (\ s +) this ->. * $', ¿Verdad? Pero solo quiero reemplazar esta parte del patrón de búsqueda: '\ s + this->'. Entonces, utilicé dos conjuntos de corchetes ... ¿Debería hacer referencia a '\ 2' o' \ 1'? –

+0

Los corchetes de captura se cuentan de izquierda a derecha, por lo que '\ 1' para ese ejemplo. Como esto está en vi, debes escapar de los bits de la expresión regular, ver la respuesta de @PrashantBhate. O eso o yo uso el indicador '\ v' en vim para usar la sintaxis normal de expresiones regulares, pero no estoy seguro si vi lo tiene. –

12

presumo que desea reemplazar en vi

reemplazar todas las ocurrencias

:s/^\(\s\+\)private function __construct()/\1def __init__/g 

Sustituir el primer

:s/^\(\s\+\)private function __construct()/\1def __init__/ 

algunas sugerencias para su patrón

  • / se utiliza en vi para la búsqueda, usar :
  • tiene que escapar () en vi
  • uso \i donde i es el grupo de captura de orden x como \1\2 con espalda patrones agrupados de referencia en el reemplazo
  • \s no se puede utilizar en el texto de reemplazo usan ' ' lugar
  • uso trailing /g si desea reemplazar todas las ocurrencias

http://vimregex.com debería ayudarlo a comenzar.

+0

Pero aquí hay un problema ... Si tengo '{$ \ n \ r replaceme', quiero buscar' {$ \ n \ r \ s + replaceme^', y solo quiero reemplazar' \ s + replaceme'. La razón por la que quiero hacer esto es porque hay momentos en los que "replaceme" no está precedido por '{$ \ n \ r', y no quiero que el comando se active en esos. Entonces, ¿puedo reemplazar "replaceme" solo cuando está precedido por '{$ \ n \ r', y comenzar mi reemplazo con la misma cantidad de espacios en blanco? –

2

No creo que nadie realmente haya entendido la pregunta. Básicamente, la forma en que lo hago es la siguiente:

"Si desea buscar un patrón de reemplazo, aplique un patrón a, y reemplácelo con una cadena de reemplazo, patrón i, solo si comienza con un patrón, patrón b, entonces necesita incluir el patrón b en la cadena de reemplazo, como esta::/(patrón b) (patrón a)/(patrón b) (i)/g ".

Es un poco prolijo pero vale la pena leerlo.

En el pasado, estoy seguro de que alguien ha pensado, "Podría ahorrar muchos recursos para no reemplazar realmente pattern b con pattern b. Es redundante hacerlo". Quizás sucede automáticamente. No he encontrado un método incorporado en vi ni en ningún otro programa para hacer eso. Sin embargo, estoy seguro de que podría escribir un guión para hacerlo.

Cuestiones relacionadas