Espressioni regolari su più righe in Visual Studio


87

C'è un modo per far sì che Visual Studio esegua una sostituzione regolare su più righe (lasciare che la corrispondenza attraversi i confini della linea)? So che ci sono molti editor che posso usare per questo, ma sembra strano che questa funzionalità sia stata esclusa da Visual Studio. Mi sto perdendo qualcosa?

Risposte:


24

Usa la finestra di dialogo Sostituisci nei file Ctrl- Shift- He l'opzione a riga singola (?s):

(?s)start.*end

trova

start
two
three
end

Singleline significa: ogni file viene trattato come una singola riga, il punto .corrisponde alla nuova riga \n. Svantaggio: è necessario utilizzare Trova tutto e sostituire tutto o sostituire a mano. Trova successivo non funziona.

Per la finestra di dialogo non modale Ctrl- He trova successivo, utilizzare (.*\n)*per abbinare qualsiasi numero di righe:

start(.*\n)*.*end

In ogni caso, puoi sostituire i risultati con più righe inserendo \n.


funziona ma vuoi il punto interrogativo extra (prima end) quindi non è avido. cioè:start(.*\n)*.*?end
Tizio CAD

4
La versione avida abbina il maggior numero di caratteri possibile tra starte end. Se vuoi trovare il prossimo, endusa la versione non avida:, (?s)start.*?endo start(.*\n)*?.*?end.
Stephan Stamm

Nota per potenziali utenti: non funziona da Visual Studio 2013. Vedi la risposta di Giles Roberts.
relativamente_random

@relately_random: hai avuto problemi nell'utilizzo (?s)?
Stephan Stamm

Si l'ho fatto. Funziona ancora per te sulle versioni più recenti di VS?
relativamente_random

72

Le espressioni regolari sono cambiate in Visual Studio 2013 . https://msdn.microsoft.com/en-us/library/2k3te2cs(v=vs.120).aspx

Per trovare un'espressione su due righe, il codice ora sarebbe:

StartOfExpression.*\r?\n.*EndOfExpression


Grazie, funziona perfettamente, </label>.*\r?\n.*<divdov'è \r?\nl'ovvia carriage_return-new_line e .*per abbinare le possibili tabulazioni / spazi
Sam

Ricevo l'errore "Il letterale '\ n' non è attualmente supportato"
ELI7VH

@ ELI7VH Non riesco a replicare il tuo errore. Quale versione di Visual Studio stai usando?
Giles Roberts

25

Funziona oggi in Visual Studio 2012:

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

Guarda come la (.*\n)+?parte combacia su più linee, non avida.
fooPatternToStartè un pattern regex sulla tua linea di partenza, mentre il barPatternToEndtuo pattern è da trovare su un'altra riga sotto, possibilmente molte righe sotto ...

Esempio trovato qui .

Semplice ed efficace :)

Nota: prima di VS2012, il modello che ha funzionato era:fooPatternToStart.(.\n)+@.*barPatternToEnd


4
nota visual studio 2012 utilizza lo stesso motore regex per trovare / sostituire come all'interno del codice, quindi quanto sopra diventa: fooPatternToStart. * (. * \ n) *?. * barPatternToEnd
Brent

@Brent: garantito, le versioni più recenti di VSTO hanno risolto il problema.
woohoo

cosa succede se voglio cercare un testo in modo specifico tra l'inizio e l'arresto? come questo? : Modifica: sprintf.*(.*\n)+?.*log.*(.*\n)+?.*__func__funziona per cercare logtra sprintfe __func__, grazie! Anche se ... sembra guardare all'infinito per quello .. se solo ci fosse un modo per limitare la quantità di linee
Gizmo

19

Nota: questa risposta utilizza la sintassi regex utilizzata in Visual Studio fino a VS 2012. In VS 2013 e versioni successive, la sintassi regex è cambiata.

Puoi includere \nnell'espressione. Ad esempio, ecco una regex che utilizzo per "pulire" script SQL generati automaticamente da qualsiasi cosa che non sia una procedura memorizzata (corrisponderà a blocchi di testo che iniziano con una riga contenente "Oggetto:" seguita da qualcosa che non lo è "StoredProcedure", quindi la corrispondenza delle seguenti righe fino a una riga è costituita dalla parola "GO"):

/\*+ Object\::b:b~(StoredProcedure)(.*\n)#GO\n

Nota: il terminatore di riga dipende dal formato del file, quindi utilizza \ n solo per il testo in stile Unix, \ r per il testo in stile Mac o \ r \ n per il testo in stile Windows.
James Wilkins,

2
Nota II: assicurati di non avere selezionato "Trova parola intera" contemporaneamente, altrimenti non funziona!
Ed Graham

1
Potresti aggiungere una nota dicendo che questa risposta si applica solo a Visual Studio 2012 e versioni precedenti per favore?
Giles Roberts,

3

potrebbe essere necessario utilizzare \ r \ n alla fine dell'espressione.


1

Acquisizione di qualsiasi carattere multilinea non avido, Visual Studio 2013+:

.*?\r?\n.*?

Versione avida nella risposta di Giles Roberts.


0

Per tutti coloro che vengono qui durante la ricerca di VS Code, lo uso per abbinare qualsiasi cosa da scripta ovunque con 2 nuove righe (escluse le nuove righe):

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

sostituire scripte \n\nper abbinare tutto tra di loro.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.