C# 教程login
C# 教程
作者:php.cn  更新時間:2022-04-11 14:06:23

C# 正規表示式



正規表示式 是一種符合輸入文字的模式。 .Net 框架提供了允許這種匹配的正規表示式引擎。模式由一個或多個字元、運算符和結構組成。

定義正規表示式

下面列出了用於定義正規表示式的各種類別的字元、運算子和結構。

  • 字元轉義

  • 字元類別

##分組建構

###限定詞#############反向引用建構###########備用建構############取代############雜項建構############字元轉義######正則表達式中的反斜線字符(\)指示其後跟的字符是特殊字符,或應按原義解釋該字符。 ######下表列出了轉義字元:###在後面有不辨識的轉義字元時,與該字元相符。 \d+[\+-x\*]\d+\d+[\+-x\*\d+"(2+2) * 3*9" 中的"2 +2" 和"3*9"

字元類別

字元類別與一組字元中的任何一個字元相符。

下表列出了字元類別:

轉義字元描述模式
#\a與警報(bell) 符\u0007 相符。 \a"Warning!" + '\u0007' 中的"\u0007"
\b 在字元類別中,與退格鍵\u0008 相符。 [\b]{3,}"\b\b\b\b" 中的"\b\b\b\b"
\t與製表符\u0009 相符。 (\w+)\t"Name\tAddr\t" 中的"Name\t" 和"Addr\t"
\r與回車符\u000D 相符。 (\r 與換行符號\n 不是等效的。)\r\n(\w+)"\r\Hello\nWorld." 中的"\r\nHello "
\v與垂直製表符\u000B 相符。 [\v]{2,}"\v\v\v" 中的"\v\v\v"
\f與換頁符號\u000C 相符。 [\f]{2,}"\f\f\f" 中的"\f\f\f"
\n與換行符號\u000A 相符。 \r\n(\w+)"\r\Hello\nWorld." 中的"\r\nHello"
\e與轉義符號\u001B 相符。 \e"\x001B" 中的"\x001B"
\ nnn#使用八進位表示形式指定一個字元(nnn 由二到三位數字組成)。 \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"
##\
與任何非空白字元相符。 \s\S"int __ctr" 中的" _"##\d#\D\D"4 = IV" 中的 " "、 "="、 " "、 "I" 和 "V"#

定位點

定位點或原子零寬度斷言會使匹配成功或失敗,這取決於字串中的當前位置,但它們不會使引擎在字串中前進或使用字元。

下表列出了定位點:

字元類別描述模式 #匹配
[character_group]#匹配character_group 中的任何單一字元。 預設情況下,匹配區分大小寫。 [mn]"mat" 中的"m","moon" 中的"m" 和"n"
[^character_group]非:與不在character_group 中的任何單一字元相符。 預設情況下,character_group 中的字元區分大小寫。 [^aei]"avail" 中的"v" 和"l"
[ first - last ]字元範圍:與從first 到last 的範圍中的任何單一字元相符。 (\w+)\t"Name\tAddr\t" 中的"Name\t" 和"Addr\t"
.通配符:與\n 以外的任何單一字元相符。
若要符合原意句點字元(. 或 \u002E),您必須在該字元前面加上轉義符 (\.)。
a.e"have" 中的"ave", "mate" 中的"ate"
\p{ name } name 指定的Unicode 通用類別或命名區塊中的任何單一字元相符。 \p{Lu}"City Lights" 中的"C" 和"L"
\P{ name } 與不在name 指定的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
與任何十進制數字匹配。 \d"4 = IV" 中的"4"
##符合不是十進制數的任意字元。
##符合符合必須從字串或一行的開頭開始。 ^\d{3}"567-777-" 中的"567"#匹配必須出現在字串的末尾或出現在行或字串末尾的 之前。 -\d{4}$"8-12-2012" 中的"-2012"符合必須出現在字串的開頭。 \A\w{4}"Code-007-" 中的"Code"匹配必須出現在字串的結尾或出現在字串末尾的 之前。 -\d{3}\Z"Bond-901-007" 中的"-007"符合必須出現在字串的結尾。 -\d{3}\z"-901-333" 中的"-333"##\G\b\w
斷言#描述模式
^
$ \n
\A
\Z \n
\z
符合必須出現在上一個符合結束的地方。 \\G\(\d\)"(1)(3)(5)[7](9)" 中的"(1)"、 "(3) " 和"(5)"
# 必須出現在(字母數字)和\W(非字母數字)字元之間的邊界上。 \w"Room#1" 中的"R"、 "o"、 "m" 和"1"
## #\B#########符合不能出現在###\b### 邊界上。 ######\Bend\w*\b######"end sends endure lender" 中的 "ends" 和 "ender"############

分組建構

分組建構描述了正規表示式的子表達式,通常用於捕獲輸入字串的子字串。

下表列出了分組建構:

# #符合( subexpression )"deep" 中的"ee"#(?< name >subexpression) "deep" 中的"ee"( ?< name1 -name2 >subexpression)"3+2^((1-3)*(3-1))" 中的"((1-3)*(3-1) )"(?: subexpression)"Console.WriteLine()" 中的"WriteLine"(?imnsx- imnsx:subexpression)subexpression"A12xl A12XL a12xl" 中的"A12xl" 和"A12XL"(?= subexpression)"He is. The dog ran. The sun is out." 中的"is"、 "ran" 和"out"(?! subexpression)"unsure sure unity used" 中的"sure" 和"used"#(?< =subexpression)"1851 1999 1950 1905 2003" 中的"99"、"50"和"05"##(?< ! subexpression)"end sends endure lender" 中的"ends" 和"ender"#(?> subexpression)"1ABB 3ABBC 5AB 5AC" 中的"1ABB"、 "3ABB" 和"5AB"
分組建構描述模式
#擷取符合的子表達式並將其指派到一個從零開始的序號中。 (\w)\1
將匹配的子表達式捕獲到一個命名組中。 (?< double>\w)\k< double>
定義平衡組定義。 (((?'Open'\()[^\(\)]*)+((?'Close-Open'\))[^\(\)]*)+)*( ?(Open)(?!))$
定義非捕獲組。 Write(?:Line)?
應用程式或停用 中指定的選項。 A\d{2}(?i:\w+)\b
零寬度正預測先行斷言。 \w+(?=\.)
零寬度負預測先行斷言。 \b(?!un)\w+\b
零寬度正回顧後發斷言。 (?<=19)\d{2}\b
#零寬度負回顧後發斷言。 (?< !19)\d{2}\b
非回溯(也稱為"貪婪")子表達式。 [13579](?>A+B+)
### ####

實例

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);
   }
}

#運行實例»##點擊"運行實例"按鈕查看線上實例

限定符

限定符指定在輸入字串中必須存在上一個元素(可以是字元、群組或字元類別)的多少個實例才能出現匹配項。 限定符包括下表中所列的語言元素。

下表列出了限定符:

#符合上一個元素一次或多次。 "be+""been" 中的"bee", "bent" 中的"be"符合上一個元素零次或一次。 "rai?n""ran"、 "rain" #符合上一個元素恰好n 次。 ",\d{3}""1,043.6" 中的",043", "9,876,543,210" 中的",876"、 ",543" 和",210"符合上一個元素至少n 次。 "\d{2,}""166"、 "29"、 "1930"符合上一個元素至少n 次,但不多於m 次。 "\d{3,5}""166", "17668", "193024" 中的 "19302"符合上一個元素零次或多次,但次數盡可能少。 \d*?\.\d".0"、 "19.9"、 "219.9"##+??? #{ n }?{ n ,}?##{ n , m }?"\d{3,5}?""166", "17668", "193024" 中的 "193" 和 "024"#

反向引用建構

反向引用允許在同一正規表示式中隨後標識先前匹配的子表達式。

下表列出了反向引用建構:

限定符描述模式
# *符合上一個元素零次或多次。 \d*\.\d".0"、 "19.9"、 "219.9"
##+
?
#{ n }
{ n ,}
{ n , m }
#*?
符合上一個元素一次或多次,但次數盡可能少。 "be+?""been" 中的"be", "bent" 中的"be"
符合上一個元素零次或一次,但次數盡可能少。 "rai??n""ran"、 "rain"
#匹配前導元素恰好n 次。 ",\d{3}?""1,043.6" 中的",043", "9,876,543,210" 中的",876"、 ",543" 和",210"
符合上一個元素至少n 次,但次數盡可能少。 "\d{2,}?""166"、 "29" 和"1930"
符合上一個元素的次數介於n 和m 之間,但次數盡可能少。
##描述\ number#\k< name >備用構造
反向引用建構##模式符合
#反向引用。 符合編號子表達式的值。 (\w)\1"seek" 中的"ee"
命名反向引用。 匹配命名表達式的值。 (?< char>\w)\k< char>"seek" 中的"ee"

備用構造用於修改正規表示式以啟用either/or 匹配。

下表列出了備用建構:

備用建構
說明模式# #符合
|符合以豎線(|) 字元分隔的任何一個元素。 th(e|is|at)"this is the day. " 中的"the" 和"this"
(?( expression )yes | no )如果正規表示式模式由expression 符合指定,則符合yes;否則符合可選的no 部分。 expression 被解釋為零寬度斷言。 (?(A)A\d{2}\b|\b\d{3}\b)"A10 C103 910" 中的"A10" 和"910"
(?( name )yes | no )如果name 或已命名或已編號的捕獲組具有匹配,則匹配yes;否則符合可選的no(?< quoted>")?(?(quoted).+?"|\S+\s)"Dogs.jpg "Yiska playing.jpg"" 中的Dogs .jpg 和"Yiska playing.jpg"

替換

替換是替換模式中使用的正規表示式。

下表列出了用於替換的字元:

##模式替換模式輸入字串結果字串number${name#$$#$&$`##$' B+$'"AABBCC""AACCCC"##$+ 取代整個輸入字串。 $_"AABBCC"#"AAAABBCCCC"##雜項構造下表列出了各種雜項建構:
字元描述
#$number##替換按群組 匹配的子字串。 \b(\w+)(\s)(\w+)\b$3$2$1"one two""two one"
name}#取代命名群組 匹配的子字串。 \b(?< word1>\w+)(\s)(?< word2>\w+)\b${word2} ${word1}"one two""two one"
取代字元"$"。 \b(\d+)\s?USD$$$1#"103 USD""$103"
取代整個符合項目的一個副本。 (\$*(\d*(\.+\d+)?){1})#**$&"$1.30""**$1.30**"
#取代符合前的輸入字串的所有文字。 B+$`"AABBCC"#"AAAACC"
取代符合後的輸入字串的所有文字。
取代最後捕獲的群組。 B+(C+)$+"AABBCCDD"AACCDD##$ _
B+

建構

##說明

實例在模式中間對諸如不區分大小寫這樣的選項進行設定或停用。 \bA(?i)b\w+\b 匹配"ABA Able Act" 中的"ABA" 和"Able"內嵌註解。該註釋在第一個右括號處終止。 \bA(?#符合以A開頭的單字)\w+\b##[行尾]該註解以非轉義的# 開頭,並繼續到行的結尾。 (?x)\bA\w+\b#符合以 A 開頭的單字

Regex 類別

Regex 類別用來表示一個正規表示式。

下表列出了Regex 類別中一些常用的方法:

#(?imnsx-imnsx)
(?#註)
#序號方法& 描述
1public bool IsMatch( string input )
指示 Regex 建構子中指定的正規表示式是否在指定的輸入字串中找到匹配項。
2public bool IsMatch( string input, int startat )
指示 Regex 建構子中指定的正規表示式是否在指定的輸入字串中找到匹配項,從字串中指定的開始位置開始。
3public static bool IsMatch( string input, string pattern )
指示指定的正規表示式是否在指定的輸入字串中找到匹配項。
4public MatchCollection Matches( string input )
在指定的輸入字串中搜尋正規表示式的所有符合項目。
5public string Replace( string input, string replacement )
在指定的輸入字串中,把所有符合正規表示式模式的所有符合的字串替換為指定的替換字串。
6public string[] Split( string input )
將輸入字串分割成子字串數組,根據在 Regex 建構子中指定的正規表示式模式定義的位置進行分割。

如需了解 Regex 類別的完整的屬性列表,請參閱微軟的 C# 文件。

實例1

下面的實例符合了以'S' 開頭的單字:

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 = "A Thousand Splendid Suns";

         Console.WriteLine("Matching words that start with 'S': ");
         showMatch(str, @"\bS\S*");
         Console.ReadKey();
      }
   }
}

當上面的程式碼被編譯和執行時,它會產生下列結果:

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

實例2

下面的實例匹配了以'm' 開頭以'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();
      }
   }
}

當上面的程式碼被編譯和執行時,它會產生下列結果:

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

實例3

下面的實例替換掉多餘的空格:

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("Original String: {0}", input);
         Console.WriteLine("Replacement String: {0}", result);    
         Console.ReadKey();
      }
   }
}

當上面的程式碼被編譯和執行時,它會產生下列結果:

Original String: Hello   World   
Replacement String: Hello World