Usare espressioni regolari in Visual Studio

Visual Studio usa le espressioni regolari di .NET per trovare e sostituire il testo.

Sintassi delle espressioni regolari

La tabella seguente contiene alcuni caratteri, operatori, costrutti ed esempi di modelli di espressioni regolari. Per informazioni più complete, vedere Linguaggio di espressioni regolari.

Scopo Espressione Esempio
Trovare la corrispondenza con qualsiasi carattere singolo (ad eccezione di un'interruzione di riga). Per altre informazioni, vedere Qualsiasi carattere. . a.o corrisponde a "aro" in "around" e "abo" in "about" ma non "acro" in "across"
Trovare la corrispondenza con zero o più occorrenze dell'espressione precedente (trovare quanti più caratteri corrispondenti possibile). Per altre informazioni, vedere Trova la corrispondenza zero o più volte. * a*r trova "r" in "rack", "ar" in "ark" e "aar" in "aardvark"
Trova la corrispondenza con qualsiasi carattere zero o più volte. .* c.*e trova "cke" in "racket", "comme" in "comment" e "code" in "code"
Trovare la corrispondenza con una o più occorrenze dell'espressione precedente (trovare quanti più caratteri corrispondenti possibile). Per altre informazioni, vedere Trova la corrispondenza una o più volte. + e+d corrisponde a "eed" in "feeder" e "ed" in "sbiadito"
Trova la corrispondenza con qualsiasi carattere uno o più volte. .+ e.+e corrisponde a "eede" in "feeder" ma non trova corrispondenze in "feed"
Trovare la corrispondenza con zero o più occorrenze dell'espressione precedente (trovare quanti meno caratteri corrispondenti possibile). Per altre informazioni, vedere Trova la corrispondenza zero o più volte (corrispondenza lazy). *? \w*?d corrisponde a "dissolvenza" e "ed" in "sbiadito", ma non all'intera parola "sbiadita" a causa della corrispondenza differita
Trovare la corrispondenza con una o più occorrenze dell'espressione precedente (trovare quanti meno caratteri corrispondenti possibile). Per altre informazioni, vedere Trova la corrispondenza una o più volte (corrispondenza lazy). +? e\w+? corrisponde a "ee" in "addormentato" e "ed" in "sbiadito" ma non trova corrispondenze in "dissolvenza"
Ancorare la stringa di corrispondenza all'inizio di una riga o stringa ^ ^car corrisponde alla parola "car" solo quando appare all'inizio di una riga
Ancorare la stringa di corrispondenza alla fine di una riga o stringa \r?$ car\r?$ corrisponde a "car" solo quando appare alla fine di una linea
Ancorare la stringa di corrispondenza alla fine del file $ car$ corrisponde a "car" solo quando viene visualizzato alla fine del file
Trovare la corrispondenza con qualsiasi carattere singolo in un set [abc] b[abc] corrisponde a "ba", "bb" e "bc"
Trovare la corrispondenza con qualsiasi carattere in un intervallo di caratteri [a-f] be[n-t] corrisponde a "bet" in "between", "ben" in "bes" in "beside", ma non trova corrispondenze in "below"
Acquisire e numerare in modo implicito l'espressione racchiusa tra parentesi () ([a-z])X\1 corrisponde a "aXa" e "bXb", ma non a "aXb". "\1" fa riferimento al primo gruppo di espressioni "[a-z]". Per altre informazioni, vedere Gruppi Capture e criteri di sostituzione.
Invalidare una corrispondenza (?!abc) real(?!ity) corrisponde a "real" in "realty" e "realmente" ma non in "realtà". Trova anche il secondo "reale" (ma non il primo "reale") in "realityreal".
Trova la corrispondenza con qualsiasi carattere che non si trova in un determinato set di caratteri. Per altre informazioni, vedere Gruppo di caratteri negativi. [^abc] be[^n-t] trova "bef" in "before", "beh" in "behind" e "bel" in "below", ma non trova corrispondenze in "sotto"
Trovare la corrispondenza con l'espressione prima o dopo il simbolo | (sponge|mud) bath corrisponde a "bagno di spugna" e "bagno di fango"
Far precedere dai caratteri di escape il carattere che segue la barra rovesciata \ \^ corrisponde al carattere ^
Specificare il numero di occorrenze del gruppo o del carattere precedente. Per altre informazioni, vedere Trova la corrispondenza esatta n volte. {n}, dove 'n' è il numero di occorrenze x(ab){2}x corrisponde a "xababx"
x(ab){2,3}x corrisponde a "xababx" e a "xabababx", ma non a "xababababx"
Trovare la corrispondenza con un testo in una categoria Unicode. Per altre informazioni sulle classi di caratteri Unicode, vedere Unicode Standard 15.0 Character Properties.For more information about Unicode character classes, see Unicode Standard 15.0 Character Properties. \p{X}, dove "X" è il numero Unicode. \p{Lu} corrisponde a "T" e "D" in "Thomas Doe"
Trovare la corrispondenza con un confine di parola \b (all'esterno di una classe di caratteri \b specifica un confine di parola e all'interno di una classe di caratteri \b specifica un backspace). \bin trova "in" in "inside" ma non trova corrispondenze in "pinto"
Trova la corrispondenza con un'interruzione di riga (ovvero un ritorno a capo seguito da una nuova riga o solo una nuova riga) \r?\n End\r?\nBegin corrisponde a "End" e "Begin" solo quando "End" è l'ultima stringa in una riga e "Begin" è la prima stringa nella riga successiva
Trovare la corrispondenza con qualsiasi carattere alfabetico \w a\wd corrisponde a "add" e "a1d" ma non a "d"
Trovare la corrispondenza con qualsiasi carattere spazio vuoto \s Public\sInterface corrisponde alla frase "Interfaccia pubblica"
Trovare la corrispondenza con qualsiasi carattere cifra decimale \d \d corrisponde a "4" e "0" in "wd40"

Un'espressione regolare di esempio che combina alcuni operatori e costrutti in modo che corrispondano a un numero esadecimale è \b0[xX]([0-9a-fA-F]+)\b. Questa espressione corrisponde a "0xc67f" ma non a "0xc67g".

Suggerimento

Nei sistemi operativi Windows la maggior parte delle righe termina con "\r\n" (un ritorno a capo seguito da una nuova riga). Questi caratteri non sono visibili ma sono presenti nell'editor e passati al servizio espressioni regolari .NET. Quando si gestiscono i file dal Web o da un sistema operativo non Windows, assicurarsi di tenere conto della possibilità che usino una nuova riga solo per un'interruzione di riga.

Gruppi Capture e criteri di sostituzione

Un gruppo Capture delinea una sottoespressione di un'espressione regolare e acquisisce una substring di una stringa di input. È possibile usare i gruppi Capture all'interno dell'espressione regolare stessa (ad esempio, per cercare una parola ripetuta) o in un criterio di sostituzione. Per informazioni dettagliate, vedere Costrutti di raggruppamento nelle espressioni regolari.

Per creare un gruppo Capture numerato, racchiudere la sottoespressione tra parentesi nel criterio dell'espressione regolare. Le acquisizioni sono numerate automaticamente da sinistra verso destra in base alla posizione delle parentesi di apertura nell'espressione regolare. Per accedere al gruppo acquisito, considerare gli esempi seguenti:

  • All'interno dell'espressione regolare: usare \number. Ad esempio, \1 nell'espressione regolare (\w+)\s\1 fa riferimento al primo gruppo Capture (\w+).

  • In un modello di sostituzione: usare $number. Ad esempio, l'espressione regolare raggruppata (\d)([a-z]) definisce due gruppi: il primo gruppo contiene una singola cifra decimale e il secondo gruppo contiene un carattere singolo compreso tra a e z. L'espressione trova quattro corrispondenze nella stringa seguente: 1a 2b 3c 4d. La stringa di sostituzione z$1 fa riferimento solo al primo gruppo ($1) e converte la stringa in z1 z2 z3 z4.

L'immagine seguente mostra un'espressione regolare (\w+)\s\1 e una stringa di sostituzione $1. Sia l'espressione regolare che il criterio di sostituzione fanno riferimento al primo gruppo Capture numerato automaticamente 1. Quando si sceglie Sostituisci tutto nella finestra di dialogo Sostituzione veloce in Visual Studio, le parole ripetute vengono rimosse dal testo.

Screenshot di Sostituzione rapida che mostra un gruppo di acquisizione numerato in Visual Studio.

Suggerimento

Nella finestra di dialogo Sostituzione rapida assicurarsi di selezionare il pulsante Usa espressioni regolari oppure premere ALT+E.

Gruppi Capture denominati

Anziché usare la numerazione automatica di un gruppo Capture, è possibile assegnargli un nome. La sintassi per un gruppo Capture denominato è (?<name>subexpression).

I gruppi Capture denominati, come i gruppi Capture numerati, possono essere usati all'interno dell'espressione regolare stessa o in un criterio di sostituzione. Per accedere al gruppo di acquisizione denominato, considerare gli esempi seguenti:

  • All'interno dell'espressione regolare: usare \k<name>. Ad esempio, \k<repeated> nell'espressione regolare (?<repeated>\w+)\s\k<repeated> fa riferimento al gruppo Capture denominato repeated la cui sottoespressione è \w+.

  • In un modello di sostituzione: usare ${name}. Ad esempio: ${repeated}.

L'immagine seguente mostra un'espressione regolare (?<repeated>\w+)\s\k<repeated> e una stringa di sostituzione ${repeated}. Sia l'espressione regolare che il criterio di sostituzione fanno riferimento al primo gruppo Capture denominato repeated. Quando si sceglie Sostituisci tutto nella finestra di dialogo Sostituzione veloce in Visual Studio, le parole ripetute vengono rimosse dal testo.

Screenshot di Sostituzione rapida che mostra un gruppo di acquisizione denominato in Visual Studio.

Suggerimento

Assicurarsi di selezionare il pulsante Usa espressioni regolari (o premere ALT+E) nella finestra di dialogo Sostituzione rapida.

Per altre informazioni sui gruppi Capture denominati, vedere Sottoespressioni corrispondenti denominate. Per altre informazioni sulle espressioni regolari usate nei criteri di sostituzione, vedere Sostituzioni nelle espressioni regolari.

Esempi

Modello Descrizione
int ([_A-Za-z][_A-Za-z0-9]*) Trova la corrispondenza con definizioni di numeri interi singoli. Gli identificatori iniziano con una lettera maiuscola o minuscola, seguita da zero o più (indicate da *) lettere o numeri. L'identificatore viene acquisito come $1 dalle parentesi esterne.
(private|internal|public)*\s*([\w]+\s+)int\s+([_A-Za-z][_A-Za-z0-9]*)\s+=\s+[+-]+(\d)+ Trova la corrispondenza con le dichiarazioni integer C# inizializzate in valori letterali integer, acquisendo le varie parti, tra cui il livello di accesso, i modificatori come const o static, l'identificatore e il valore definito. Si noti l'uso di \s+ per almeno un carattere di spazio vuoto o \s* se potrebbe verificarsi uno spazio vuoto o meno.
foreach\s*\(([\w\d]*)\s+([\w\d]*)\s+in\s+(.*)\) Trova la corrispondenza con la riga di apertura di un foreach ciclo. Le parentesi letterali vengono precedute da un carattere di escape con barra rovesciata (\). I vari gruppi vengono acquisiti come $1, $2e $3 dalle parentesi senza caratteri di escape.
#define\s+([_A-Za-z][_A-Za-z0-9]*) Corrisponde #define alle definizioni (senza il valore, se presente). Il token definito viene archiviato in $1.
#include\s+["<](.*)[">] La corrispondenza include in un file di origine C++.