English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Espressione regolare di C# (Regular Expression)

Espressione regolare È un modello di match per il testo di input.

Il framework .Net fornisce un motore di espressioni regolari che permette questo tipo di match.

Il modello è composto da uno o più caratteri, operatori e strutture.

Definire l'espressione regolare

Di seguito è elencato i caratteri, operatori e strutture utilizzati per definire le varie categorie di espressioni regolari.

  • Caratteri di escape

  • 字符类

  • 定位点

  • 分组构造

  • Simbolo di limitazione

  • 反向引用构造

  • 备用构造

  • Sostituzione

  • Costrutti vari

Caratteri di escape

Il carattere di backslash () nei espressioni regolari indica che il carattere che segue è un carattere speciale, o che il carattere deve essere interpretato letteralmente.

La seguente tabella elenca i caratteri di escape:

Carattere di escapeDescrizioneModello匹配
\aCorrisponde al carattere di alarm (bell) \u0007.\aNella stringa "Warning!" + '\u0007' è presente "\u0007"
\bNel carattere classe, corrisponde alla chiave di backspace \u0008.[\b]{3,}Nella stringa "\b\b\b\b" è presente "\b\b\b\b"
\tCorrisponde al carattere di tab \u0009.(\w+)\tNella stringa "Name\tAddr\t" è presente "Name\t" e "Addr\t"
\rCorrisponde al carattere di carriage return \u000D. (\r e il carattere di newline \n non sono equivalenti).\r\n(\w+)Nella stringa "\r\nHello\nWorld." è presente "\r\nHello"
\vCorrisponde al carattere di tab verticale \u000B.[\v]{2,}Nella stringa "\v\v\v" è presente "\v\v\v"
\fCorrisponde al carattere di page break \u000C.[\f]{2,}Nella stringa "\f\f\f" è presente "\f\f\f"
\nCorrisponde al carattere di newline \u000A.\r\n(\w+)Nella stringa "\r\nHello\nWorld." è presente "\r\nHello"
\eCorrisponde al carattere di escape \u001B.\e"\x001B" nella "\x001B"
\ nnnSpecificare un carattere in notazione ottale (nnn composto da due a tre numeri).\w\040\w"a bc d"中的"a b"和"c d"
\x nn使用十六进制表示形式指定字符(nn恰好由两位数字组成)。\w\x20\w"a bc d"中的"a b"和"c d"
\c X \c x匹配X或x指定的ASCII控制字符,其中X或x是控制字符的字母。\cC"\x0003"中的"\x0003"(Ctrl-C)
\u nnnn使用十六进制表示形式匹配一个Unicode字符(由nnnn表示的四位数)。\w\u0020\w"a bc d"中的"a b"和"c d"
\在后面带有不识别的转义字符时,与该字符匹配。\d+[\+-x\*]\d+\d+[\+-x\*\d+"(2+2) * 3*9"中的"2+2"和"3*9"

字符类

字符类与一组字符中的任何一个字符匹配。

下表列出了字符类:

字符类DescrizioneModello匹配
[character_group]匹配character_group中的任何单个字符。默认情况下,匹配区分大小写。[mn]"mat"中的"m","moon"中的"m"和"n"
[^character_group]非:与不在character_group中的任何单个字符匹配。默认情况下,character_group中的字符区分大小写。[^aei]"avail"中的"v"和"l"
[ first - last ]字符范围:与从first到last的范围中的任何单个字符匹配。[b-d][b-d]irds可以匹配Birds、Cirds、Dirds
.通配符:与除\n之外的任何单个字符匹配。
若要匹配原意句点字符(.或\u002E),您必须在该字符前面加上转义符(\.)。
a.e"have"中的"ave","mate"中的"ate"
\p{ name }nome 指定的Unicode通用类别或命名块中的任何单个字符匹配。\p{Lu}"City Lights"中的"C"和"L"
\P{ name }与不在 nome 指定的Unicode通用类别或命名块中的任何单个字符匹配。\P{Lu}"City"中的"i"、"t"和"y"
\w与任何单词字符匹配。\w"Room#1"中的"R"、"o"、"m"和"1"
\W与任何非单词字符匹配。\W"Room#1" 中的 "#"
\s与任何空白字符匹配。\w\s"ID A1.3" 中的 "D "
\S与任何非空白字符匹配。\s\S"int __ctr" 中的 " _"
\d与任何十进制数字匹配。\d"4 = IV" 中的 "4"
\D匹配不是十进制数的任意字符。\D"4 = IV" 中的 " "、 "="、 " "、 "I" 和 "V"

定位点

定位点或原子零宽度断言会使匹配成功或失败,具体取决于字符串中的当前位置,但它们不会使引擎在字符串中前进或使用字符。

下表列出了定位点:

断言DescrizioneModello匹配
^匹配必须从字符串或一行的开头开始。^\d{3}"567-777-" 中的 "567"
$匹配必须出现在字符串的末尾或出现在行或字符串末尾的 \n 之前。-\d{4}$"8-12-2012" 中的 "-2012"
\A匹配必须出现在字符串的开头。\A\w{4}"Code-007-" 中的 "Code"
\Z匹配必须出现在字符串的末尾或出现在字符串末尾的 \n 之前。-\d{3}\Z"Bond-901-007" 中的 "-007"
\z匹配必须出现在字符串的末尾。-\d{3}\z"-901-333" 中的 "-333"
\G匹配必须出现在上一个匹配结束的地方。\G\(\d\)"(1)(3)(5)[7](9)" 中的 "(1)"、 "(3)" 和 "(5)"
\b匹配一个单词边界,也就是指单词和空格间的位置。er\b匹配"never"中的"er",但不能匹配"verb"中的"er"。
\B匹配非单词边界。er\B匹配"verb"中的"er",但不能匹配"never"中的"er"。

分组构造

分组构造描述了正则表达式的子表达式,通常用于捕获输入字符串的子字符串。

下表列出了分组构造:

分组构造DescrizioneModello匹配
( subexpression )捕获匹配的子表达式并将其分配到一个从零开始的序号中。(\w)\1"deep" 中的 "ee"
(?< name >subexpression)将匹配的子表达式捕获到一个命名组中。(?< double>\w)\k< double>"deep" 中的 "ee"
(?< nome1 -nome2 >espressione)Definire il gruppo bilanciato.(((?'Apri'\()[^\(\)]*)+((?'Chiudi-Apri'\))[^\(\)]*)+)*(?(Apri)(?!))$In "3+2^((1-3)*(3-1))" è "((1-3)*(3-1))"
(?: espressione)Definire un gruppo non catturato.Write(?:Line)?In "Console.WriteLine()" è "WriteLine"
(?imnsx-imnsx:espressione)Applicare o disabilitare espressione opzione specificata.A\d{2}(?i:\w+)\bIn "A12xl A12XL a12xl" sono "A12xl" e "A12XL"
(?= espressione)Affermazione di previsione anticipata di larghezza zero.\w+(?=\.)In "He is. The dog ran. The sun is out." sono "is", "ran" e "out"
(?! espressione)Affermazione di previsione negativa di larghezza zero.\b(?!un)\w+\bIn "unsure sure unity used" sono "sure" e "used"
(?<=espressione)Affermazione di ritorno anticipato di larghezza zero.(?A+B+)In "1ABB 3ABBC 5AB 5AC" sono "1ABB", "3ABB" e "5AB"
using System;
using System.Text.RegularExpressions;
public class Example
{
   public static void Main()
   {
      string input = "1851 1999 1950 1905 2003";
      string pattern = @"(?<=19)\d{2}\b";
      foreach (Match match in Regex.Matches(input, pattern))
         Console.WriteLine(match.Value);
   }
}


Esempio di esecuzione »

Simbolo di limitazione

Il simbolo di limitazione specifica quante occorrenze dell'elemento precedente (può essere un carattere, un gruppo o una classe di caratteri) devono esistere nella stringa di input per poter apparire la corrispondenza. I simboli di limitazione includono gli elementi linguistici elencati nella tabella.

La tabella seguente elenca i simboli di limitazione:

Simbolo di limitazioneDescrizioneModello匹配
*Corrisponde zero o più volte all'elemento precedente.\d*\.\d".0"、 "19.9"、 "219.9"
+Corrisponde una volta o più volte all'elemento precedente."be+""been" 中的 "bee", "bent" 中的 "be"
?匹配上一个元素零次或一次。"rai?n""ran"、 "rain"
{ n }匹配上一个元素恰好 n 次。",\d{3}""1,043.6" 中的 ",043", "9,876,543,210" 中的 ",876"、 ",543" 和 ",210"
{ n ,}匹配上一个元素至少 n 次。"\d{2,}""166"、 "29"、 "1930"
{ n , m }匹配上一个元素至少 n 次,但不多于 m 次。"\d{3,5}""166", "17668", "193024" 中的 "19302"
*?匹配上一个元素零次或多次,但次数尽可能少。\d*?\.\d".0"、 "19.9"、 "219.9"
+?匹配上一个元素一次或多次,但次数尽可能少。"be+?""been" 中的 "be", "bent" 中的 "be"
??匹配上一个元素零次或一次,但次数尽可能少。"rai??n""ran"、 "rain"
{ n }?匹配前导元素恰好 n 次。",\d{3}?""1,043.6" 中的 ",043", "9,876,543,210" 中的 ",876"、 ",543" 和 ",210"
{ n ,}?匹配上一个元素至少 n 次,但次数尽可能少。"\d{2,}?""166"、 "29" 和 "1930"
{ n , m }?匹配上一个元素的次数介于 n 和 m 之间,但次数尽可能少。"\d{3,5}?""166", "17668", "193024" 中的 "193" 和 "024"

反向引用构造

反向引用允许在同一正则表达式中随后标识以前匹配的子表达式。

下表列出了反向引用构造:

反向引用构造DescrizioneModello匹配
\ numero反向引用。 匹配编号子表达式的值。(\w)\1"seek" 中的 "ee"
\k< nome >命名反向引用。 匹配命名表达式的值。(?<carattere>\w)\k<carattere>"seek" 中的 "ee"

备用构造

备用构造用于修改正则表达式以启用 either/or 匹配。

下表列出了备用构造:

备用构造DescrizioneModello匹配
|匹配以竖线 (|) 字符分隔的任何一个元素。th(e|is|at)"this is the day. " 中的 "the" 和 "this"
(?(espressione)si | no )Se il modello di espressione regolare è specificato da expression, corrisponde. yes; altrimenti corrisponde all'opzionale no Parte. L'espressione è interpretata come affermazione di lunghezza zero.(?(A)A\d{2}\b|\b\d{3}\b)In "A10 C103 910" i "A10" e "910"
(?( name )yes | no )Corrisponde se il gruppo di nome o il gruppo catturato numerato ha una corrispondenza. yes; altrimenti corrisponde all'opzionale no.(?< quoted>")?(?(quoted).+?"|\S+\s)In "Dogs.jpg "Yiska playing.jpg"" i Dogs.jpg e "Yiska playing.jpg"

Sostituzione

La sostituzione è l'espressione regolare utilizzata nel modello di sostituzione.

La tabella seguente elenca i caratteri utilizzati per la sostituzione:

CarattereDescrizioneModelloModello di sostituzioneStringa di inputStringa di risultato
$numeroSostituisci per gruppo numero Sottostringa corrispondente.\b(\w+)(\s)(\w+)\b$3$2$1"uno due""due uno"
${nome}Sostituisci per nome del gruppo nome Sottostringa corrispondente.\b(?< word1>\w+)(\s)(?< word2>\w+)\b${word2} ${word1}"uno due""due uno"
$$Sostituisci il carattere "$".\b(\d+)\s?USD$$$1"103 USD""$103"
$&Sostituisci una copia dell'intera corrispondenza.(\$*(\d*(\.+\d+)?){1})**$&"$1.30""**$1.30**"
$`Sostituisci tutto il testo di input prima della corrispondenza.B+$`"AABBCC""AAAACC"
$'Sostituisci tutto il testo matchato dopo la corrispondenza.B+$'"AABBCC""AACCCC"
$+Sostituisci l'ultimo gruppo catturato.B+(C+)$+"AABBCCDD"AACCDD
$_Sostituisci l'intera stringa di input.B+$_"AABBCC""AAAABBCCCC"

Costrutti vari

La tabella seguente elenca vari costrutti vari:

CostruzioneDescrizioneEsempio
(?imnsx-imnsx)Imposta o disabilita le opzioni come la case sensitivity nel mezzo del modello.\bA(?i)b\w+\b Corrisponde a "ABA Able Act" in "ABA" e "Able"
(?#Commento)Commento inline. Questo commento termina alla prima parentesi destra.\bA(?#Corrisponde alla parola che inizia con A)\w+\b
# [fine della riga]Questo commento inizia con un # non escapato e continua fino alla fine della riga.(?x)\bA\w+\b#Matcha le parole che iniziano con A

Classe Regex

La classe Regex viene utilizzata per rappresentare un'espressione regolare.

La tabella seguente elenca alcuni dei metodi più comuni della classe Regex:

NumeroMetodo & Descrizione
1public bool IsMatch( string input )
Indica se l'espressione regolare specificata è stata trovata in una stringa di input specificata.
2public bool IsMatch( string input, int startat )
Indica se l'espressione regolare specificata è stata trovata in una stringa di input specificata, iniziando dalla posizione specificata nella stringa.
3public static bool IsMatch( string input, string pattern )
Indica se l'espressione regolare specificata è stata trovata in una stringa di input specificata.
4public MatchCollection Matches( string input )
Cerca tutte le occorrenze dell'espressione regolare specificata nell'input stringa specificato.
5public string Replace( string input, string replacement )
Sostituisce tutte le occorrenze che corrispondono al modello di espressione regolare specificato con la stringa di sostituzione specificata nel input stringa specificato.
6public string[] Split( string input )
Divide la stringa di input in un array di sottostringhe, in base alla posizione definita dal modello di espressione regolare specificato nel costruttore Regex.

Per ottenere una lista completa delle proprietà della classe Regex, consultare la documentazione di Microsoft C#.

Esempio 1

Di seguito è riportato un esempio che matcha le parole che iniziano con 'S':

Esempio Online

using System;
using System.Text.RegularExpressions;
namespace RegExApplication
{
   class Program
   {
      private static void showMatch(string text, string expr)
      {
         Console.WriteLine("L'Espression: " + expr);
         MatchCollection mc = Regex.Matches(text, expr);
         foreach (Match m in mc)
         {
            Console.WriteLine(m);
         }
      }
      static void Main(string[] args)
      {
         string str = "Un Mille Splendidi Soleils";
         Console.WriteLine("Matching words that start with 'S': ");
         showMatch(str, @"\bS\S*");
         Console.ReadKey();
      }
   }
}

Quando il codice sopra viene compilato ed eseguito, produrrà il seguente risultato:

Matching words that start with 'S':
The Expression: \bS\S*
Splendid
Suns

Esempio 2

Di seguito è riportato un esempio di match di parole che iniziano con 'm' e terminano con 'e':

using System;
using System.Text.RegularExpressions;
namespace RegExApplication
{
   class Program
   {
      private static void showMatch(string text, string expr)
      {
         Console.WriteLine("The Expression: " + expr);
         MatchCollection mc = Regex.Matches(text, expr);
         foreach (Match m in mc)
         {
            Console.WriteLine(m);
         }
      }
      static void Main(string[] args)
      {
         string str = "make maze and manage to measure it";
         Console.WriteLine("Matching words start with 'm' and ends with 'e':");
         showMatch(str, @"\bm\S*e\b");
         Console.ReadKey();
      }
   }
}

Quando il codice sopra viene compilato ed eseguito, produrrà il seguente risultato:

Matching words start with 'm' and ends with 'e':
The Expression: \bm\S*e\b
make
maze
manage
measure

Esempio 3

Di seguito è riportato un esempio di sostituzione degli spazi in eccesso:

using System;
using System.Text.RegularExpressions;
namespace RegExApplication
{
   class Program
   {
      static void Main(string[] args)
      {
         string input = "Hello   World   ";
         string pattern = "\\s+";
         string replacement = " ";
         Regex rgx = new Regex(pattern);
         string result = rgx.Replace(input, replacement);
         Console.WriteLine("Stringa originale: {0}", input);
         Console.WriteLine("Stringa di sostituzione: {0}", result);    
         Console.ReadKey();
      }
   }
}

Quando il codice sopra viene compilato ed eseguito, produrrà il seguente risultato:

Stringa originale: Hello     World   
Stringa di sostituzione: Hello World