Expresiones regulares de varias líneas en Visual Studio

87

¿Hay alguna forma de hacer que Visual Studio realice un reemplazo de expresiones regulares en varias líneas (deje que la coincidencia cruce los límites de línea)? Sé que hay muchos editores que puedo usar para esto, pero parece extraño que esta característica se haya dejado fuera de Visual Studio. ¿Me estoy perdiendo de algo?

Paul Keister
fuente

Respuestas:

25

Utilice el cuadro de diálogo reemplazar en archivos Ctrl- Shift- Hy la opción de una sola línea (?s):

(?s)start.*end

encuentra

start
two
three
end

Una línea significa: cada archivo se trata como una sola línea, el punto .coincide con la nueva línea \n. Desventaja: debe usar Buscar todo y reemplazar todo, o reemplazar a mano. Buscar siguiente no funciona.

Para el cuadro de diálogo no modal Ctrl, Hy busque a continuación, use (.*\n)*para hacer coincidir cualquier número de líneas:

start(.*\n)*.*end

De cualquier manera, puede reemplazar sus hallazgos con varias líneas insertando \n.

Stephan Stamm
fuente
esto funciona, pero desea el signo de interrogación adicional (antes end) para que no sea codicioso. es decir:start(.*\n)*.*?end
CAD bloke
4
La versión codiciosa coincide con tantos caracteres como sea posible entre starty end. Si desea encontrar el siguiente, enduse la versión no codiciosa:, (?s)start.*?endo start(.*\n)*?.*?end.
Stephan Stamm
Nota para los usuarios potenciales: no funciona desde Visual Studio 2013. Vea la respuesta de Giles Roberts.
relativamente_random
@relatively_random: ¿Tuviste problemas para usar (?s)?
Stephan Stamm
Sí, lo hice. ¿Todavía te funciona en las versiones más nuevas de VS?
relativamente_random
72

Las expresiones regulares han cambiado en Visual Studio 2013 . https://msdn.microsoft.com/en-us/library/2k3te2cs(v=vs.120).aspx

Para hacer coincidir una expresión en dos líneas, el código ahora sería:

StartOfExpression.*\r?\n.*EndOfExpression

Giles Roberts
fuente
Gracias, esto funciona perfectamente, </label>.*\r?\n.*<divdonde \r?\nestá el obvio carriage_return-new_line y .*para hacer coincidir las posibles pestañas / espacios
Sam
Recibo el error "Literal '\ n' no es compatible actualmente"
ELI7VH
@ ELI7VH No puedo replicar tu error. ¿Qué versión de Visual Studio estás usando?
Giles Roberts
25

Esto funciona hoy en Visual Studio 2012:

fooPatternToStart.*(.*\n)+?.*barPatternToEnd

Vea cómo la (.*\n)+?pieza coincide en varias líneas, sin codicia.
fooPatternToStarthay un patrón de expresiones regulares en su línea de inicio, mientras barPatternToEndque su patrón es encontrarlo en otra línea debajo, posiblemente muchas líneas debajo ...

Ejemplo encontrado aquí .

Simple y efectivo :)

Nota: antes de VS2012, el patrón que funcionó fue:fooPatternToStart.(.\n)+@.*barPatternToEnd

woohoo
fuente
4
note Visual Studio 2012 usa el mismo motor de expresiones regulares para buscar / reemplazar que dentro del código, por lo que lo anterior se convierte en: fooPatternToStart. * (. * \ n) *?. * barPatternToEnd
Brent
@Brent: concedido, las versiones más recientes de VSTO han solucionado ese problema.
woohoo
¿Qué pasa si quiero buscar un texto específicamente entre el inicio y el final? ¿Me gusta esto? : Editar: sprintf.*(.*\n)+?.*log.*(.*\n)+?.*__func__funciona para buscar logentre sprintfy __func__, ¡gracias! Aunque ... parece mirar al infinito para eso ... si solo hubiera una manera de limitar la cantidad de líneas
Gizmo
19

Nota: esta respuesta usa la sintaxis de expresiones regulares utilizada en Visual Studio hasta VS 2012. En VS 2013 y versiones posteriores, la sintaxis de expresiones regulares ha cambiado.

Puede incluir \nen la expresión. Como ejemplo, aquí hay una expresión regular que utilizo para "limpiar" los scripts SQL generados automáticamente de cualquier cosa que no sea un procedimiento almacenado (coincidirá con los bloques de texto que comienzan con una línea que contiene "Objeto:" seguido de algo que no es "StoredProcedure", luego hacer coincidir las siguientes líneas hasta una línea consiste en la palabra "GO"):

/\*+ Object\::b:b~(StoredProcedure)(.*\n)#GO\n
Fredrik Mörk
fuente
Nota: El terminador de línea depende del formato del archivo, por lo que solo use \ n para texto de estilo Unix, \ r para texto de estilo Mac o \ r \ n para texto de estilo Windows.
James Wilkins
2
Nota II: asegúrese de no tener marcado "Coincidir palabra completa" al mismo tiempo, de lo contrario, esto no funciona.
Ed Graham
1
¿Podría agregar una nota que diga que esta respuesta solo se aplica a Visual Studio 2012 y versiones anteriores, por favor?
Giles Roberts
3

es posible que deba usar \ r \ n al final de su expresión.

Keng
fuente
1

Captura de caracteres multilínea no codiciosa, Visual Studio 2013+:

.*?\r?\n.*?

Versión codiciosa en la respuesta de Giles Roberts.

maullar
fuente
0

Para todos los que vienen aquí mientras buscan VS Code, lo uso para hacer coincidir cualquier cosa desde scriptcualquier lugar con 2 líneas nuevas (excluidas las líneas nuevas):

script(.|\n)+?(?=\n\n)

reemplazar scripty \n\nhacer coincidir todo entre ellos.

Ali Tou
fuente