¿Cómo hace referencia a un grupo de captura con expresiones regulares buscar y reemplazar en Visual Studio 2012, 2013, 2015 y VS Code

255

Me doy cuenta de que hay un montón de preguntas sobre esto, pero ninguna de las que encontré mencionaba específicamente a qué versión de VS se referían. Con la falta de esa información importante, todavía no pude usar con éxito las respuestas que encontré. El más común fue

  • Envolvente con {}, captura de pantalla con \ 1, \ 2, \ n

Sin embargo, ese parece ser el antiguo método para buscar y reemplazar expresiones regulares en Visual Studio, y no funciona en VS 2012.

SgtPooki
fuente
1
Esto no es demasiado difícil de encontrar en la ayuda: en el diálogo Buscar / Reemplazar, F1; Al principio de Buscar y reemplazar texto hay un enlace para Usar expresiones regulares en VS ; allí el segundo consejo lo remite a las sustituciones en expresiones regulares ; allí le brinda los conceptos básicos y dice que hay más detalles en Sustituir un grupo numerado y Sustituir un grupo con nombre .
PJTraill
2
@PJTraill es bueno saber que hicieron más fácil responder una pregunta para su versión 2012 en algún momento entre 2013 y 2015. Sin embargo, por los votos, creo que es bastante obvio que todavía no es "no demasiado difícil" encontrar la ayuda. OMI: Si es más fácil buscar y votar en un artículo de desbordamiento de pila que usar buscar, reemplazar y capturar sin buscar ayuda, entonces es mucho más difícil de lo que debería ser.
SgtPooki
Una cosa que me molesta acerca de MSVS 2012/3 son los dos diálogos diferentes de Buscar / Reemplazar, en particular el más pequeño (Ctrl-H), donde me mantengo accidentalmente (con pulsaciones de teclas que probablemente significan algo más en otro lugar) alterando el alcance de la búsqueda . Pero lo que quiero señalar es que el diálogo más grande (Ctrl-Shift-H) tiene botones después de los campos Buscar y reemplazar que le dan una lista de las posibilidades más importantes, incluyendo lo que está buscando, por lo que no ¡necesitas ayuda! Supongo que muchas personas no ven los botones o aterrizan en el diálogo Ctrl-H y no pueden verlos.
PJTraill
Estoy de acuerdo en que la ayuda es un poco molesta de encontrar; Sospecho que dan prioridad a la búsqueda de texto sin formato. Mi punto es más que si uno sabe o supone que debe estar allí, puede encontrarlo razonablemente fácilmente; a menudo sigo esa ruta, ya que prefiero usar la documentación canónica una vez que puedo encontrarla. No quise sonar despectivo; Creo que es "demasiado difícil" y "no demasiado difícil": no son opuestos si ves que "no demasiado" califica como "difícil" y agregas la respuesta al implícito "¿difícil para qué?".
PJTraill
"Sabía" que el etiquetado REGEXP estaba usando '()', volví a leer la documentación y no funcionó ... así que vine aquí para asegurarme ... luego hice un poco más de experimentación y funcionó. Entonces, en mi humilde opinión, la documentación de MSDN debe ser súper clara de que () se utilizan para "etiquetar" una expresión, para aquellos de nosotros que tuvimos que aprender la antigua nomenclatura de "etiquetar" VS6. Sería bueno si pudieran usar esa misma nomenclatura. Grupos numerados ... simplemente no enciende las sinapsis suficientemente bien en mi humilde opinión.
Ross Youngblood

Respuestas:

356

Para buscar y reemplazar en VS 2012 y VS 2015, haga lo siguiente:

Ejemplo (gracias a syonip)

En las opciones de búsqueda, asegúrese de que 'usar expresiones regulares' esté marcado y coloque lo siguiente como texto para buscar:

_platformActions.InstallApp\((.+)\)

Y lo siguiente como texto para reemplazarlo:

this.Platform().App($1).Install()

Nota: Como señala SLaks en un comentario a continuación, el cambio en la sintaxis de expresiones regulares se debe a que VS2012 cambió al motor de expresiones regulares .Net.

Nota: Otro comentarista señaló que esto también funciona en Visual Studio Code (vscode)

SgtPooki
fuente
10
Para ser más general, VS2012 ahora usa el motor estándar .Net regex.
SLaks
44
¿No necesitas escapar del período char entre _platformActionsy InstallApp?
rory.ap
Pensando en eso ahora, tendría sentido. No lo he probado. Siéntase libre de lanzar una edición allí.
SgtPooki
1
Termina usando el nombre como numérico parece que no funciona para mí al menos. (?<rval>.+)en búsqueda y en reemplazo${rval}
Mark Schultheiss
2
Ayuda adicional: si desea reemplazar la cosa (. *) Con la cosa $ 18 (agregando un '8' directamente después de la captura) deberá usar la cosa $ {1} 8
Luc Bloom
17

Para agregar un ejemplo de esto, aquí hay algo que tuve que hacer en mi código:

Encontrar que:

_platformActions.InstallApp\((.+)\)

Reemplazar con:

this.Platform().App($1).Install()

Esto reemplaza cualquier llamada a InstallApp (x), con this.Platform (). App (x) .Install ().

* No olvide marcar "Usar expresiones regulares" en las opciones de búsqueda

syonip
fuente
10

Si desea trabajar usando nombres de grupo (usando la misma muestra que arriba):

Encontrar que:

_platformActions\.InstallApp\((?<mygroupname>.+)\)

Reemplazar con:

this.Platform().App(${mygroupname}).Install()
Yepeekai
fuente
9

Para mejorar las respuestas anteriores: debe reemplazar

_platformActions.InstallApp\((.+)\)

con

this.Platform().App(${1}).Install()

Tenga en cuenta los $ {1} si alguna vez desea agregar un número detrás de la captura. $18intentará insertar la captura de búsqueda número 18, no la primera con un 8anexo.

Luc Bloom
fuente