首頁 > 後端開發 > C#.Net教程 > 【c#教學】C# 正規表示式

【c#教學】C# 正規表示式

黄舟
發布: 2016-12-24 13:37:52
原創
1084 人瀏覽過

C# 正規表示式

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

定義正規表示式

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

字符轉義

字符類

定位點

分組構造

限定符

反向引用構造

義詞

反向引用構造

義詞

義詞

反向引用反斜線字符()指示其後跟的字符是特殊字符,或應按原義解釋該字符。

下表列出了轉義字符:

轉義字符

描述

模式

匹配

a    符與警報符    a    "Warning!" + 'u0007' 中的 "u0007"    

b    在字元類別中,與退格鍵 u0008 相符。    [b]{3,}    "bbbb" 中的 "bbbb"    

t    與製表符 u0009 相符。    (w+)t    "NametAddrt" 中的 "Namet" 和 "Addrt"    

r    與回車符 u000D 相符。 (r 與換行符號 n 不是等效的。)   rn(w+)    "rHellonWorld." 中的 "rnHello"    

v    與垂直製表符 u000B 相符。    [v]{2,}    "vvv" 中的 "vvv"    

f    與換頁符 u000C 相符。    [f]{2,}    "fff" 中的 "fff"    

n    與換行符 u000A 相符。    rn(w+)    "rHellonWorld." 中的 "rnHello"    

e    與轉義符 u001B 相符。    e    "x001B" 中的 "x001B"    

nnn    使用八進位表示形式指定一個字元(nnn 由二到三位數字組成)。    w

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    與任何空格字元相符。    ws    "ID A1.3" 中的 "D "    

S    與任何非空白字元相符。    sS    "int __ctr" 中的 " _"    

d    與任何十進位數字相符。    d    "4 = IV" 中的 "4"    

D    匹配不是十進位數的任意字元。 D    "4 = IV" 中的" "、 "="、 " "、 "I" 和"V"    

定位點

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

下表列出了定位點:

斷言

描述

模式

符合字串或一行的開頭

^  

符合字串或一行的開頭必須從一行中開始。    ^d{3}    "567-777-" 中的 "567"    

$    配對必須出現在字串的結尾或出現在行或字串結尾的 n 之前。    -d{4}$    "8-12-2012" 中的 "-2012"    

A    配對必須出現在字串的開頭。    Aw{3}    "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    配對必須出現在 w(字母數字)和 W(非字母數字)字元之間的邊界上。    w    "Room#1" 中的 "R"、 "o"、 "m" 和 "1"    

B    配對不得出現在 b 邊界。    Bendw*b    "end sends endure lender" 中的 "ends" 和 "ender"    

分組構造

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

下表列出了分組構造:

分組構造

描述

模式

匹配

( subexpress 。    (w)1    "deep" 中的 "ee"    

(?subexpression)    將相符的子運算式擷取到一個命名群組中。    (?w)k    "deep" 中的 "ee"    

(?subexpression)   定義平衡組定義。 (((?'Open'()[^()]*)+((?'Close-Open'))[^()]*)+)*(?(Open)(?!))$    "3 +2^((1-3)*(3-1))" 中的"((1-3)*(3-1))"    

(?: subexpression)    定義非捕獲組。    Write(?:Line)?    "Console.WriteLine()" 中的 "WriteLine"    

(?imnsx-imnsx:subexpression)  子應用或停用 subexpression 中指定的選項。    Ad{2}(?i:w+)b    "A12xl A12XL a12xl" 中的 "A12xl" 和 "A12XL"    

(?= subexpression)    零寬度正預測先行斷言先行。    w+(?=.)    "He is. The dog ran. The sun is out." 中的 "is"、 "ran" 和 "out"    

(?! subexpression)    零寬度負預測先行斷言。    b(?!un)w+b    "unsure sure unity used" 中的 "sure" 和 "used"    

(?

(?

(?> subexpression)    非回溯(也稱為「貪婪"")子式表達。 [13579](?>A+B+)    "1ABB 3ABBC 5AB 5AC" 中的"1ABB"、 "3ABB" 與"5AB"    

限定符

是字元、群組或字元類別)的多少個實例才能出現匹配項。 限定符包括下表中所列的語言元素。

下表列出了限定符:

限定符

描述

模式

匹配

*    

匹配上一個元素零或多次。    d*.d    ".0"、 "19.9"、 "219.9"    

+    搭配上一個元素一次或多次。    "be+"    "been" 中的 "bee", "bent" 中的 "be"    

?    搭配上一個元素零次或一次。    "rai?n"    "ran"、 "rain"    

{ n }    搭配上一個元素剛好 n 次。    ",d{3}"    "1,043.6" 中的 ",043", "9,876,543,210" 中的 ",876"、 ",543" 和 ",210" 上一個  🎠      "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 ,次,但次數盡量少。    "d{2,}?"    "166"、 "29" 和 "1930"    

{ n , m }?    配對上一個元素的次數介於 n 和 m 之間,但次數盡可能少。 "d{3,5}?"    "166", "17668", "193024" 中的"193" 和"024"    

反向引用構造

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

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

反向引用構造

描述

模式

匹配

number  

匹配

number    反向引用。 符合編號子表達式的值。    (w)1    "seek" 中的 "ee"    

k    命名反向引用。 匹配命名表達式的值。    (?w)k    "seek" 中的 "ee"    

備用構造

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

下表列出了備用構造:

備用構造

描述

模式

匹配

🎜🎜🎜|    🎜匹配🎜🎜🎜🎜|    🎜匹配元素的一個匹配元素。    th(e|is|at)    "this is the day. " 中的 "the" 和 "this"    🎜

(?( expression )yes | no )    如果正規表示式模式由 expression 符合指定,則符合 yes;否則符合可選的 no 部分。 expression 被解釋為零寬度斷言。 (?(A)Ad{2}b|bd{3}b)    "A10 C103 910" 中的"A10" 和"910"    

(?( name )yes | no )    

(?( name )yes | no )    

(?( name )yes | no )    

或已命名或已命名編號的捕獲組具有匹配,則匹配 yes;否則匹配可選的 no。 (?")?(?(quoted).+?"|S+s)    "Dogs.jpg "Yiska playing.jpg"" 中的Dogs.jpg 和"Yiska playing.jpg"    

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

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

字元

描述

模式

替換模式

 子字串。    b(w+)(s)(w+)b    $3$2$1    "one two"    "two one"    

${name}   以命名群組   

${name}   以命名群組 name name name 的子。    b(?w+)(s)(?w+)b    ${word2} ${word1}    "one two"    "two "    

   b(d+)s?USD    $$$1    "103 USD"    "$103"    

$&    取代整個配對的一個副本。    ($*(d*(.+d+)?){1})    **$&    "$1.30"    "**$1.30**"    

$`        B+    $`    "AABBCC"    "AAAACC"    

$'    替換所有符合後的輸入字串的文字。    B+    $'    "AABBCC"    "AACCCC"    

$+    替換最後被捕獲的組別。    B+(C+)    $+    "AABBCCDD"    AACCDD    

$_    取代整個輸入字串。 B+    $_    "AABBCC"    "AAAABBCCCC"  $_    "AABBCC"    "AAAABBCCCC"  $  

雜項構造

下表列出了各種雜項構造:

? -imnsx)    在模式中間對諸如不區分大小寫這樣的選項進行設定或停用。    bA(?i)bw+b 符合 "ABA Able Act" 中的 "ABA" 和 "Able"    

(?#comment)    內嵌註解。該註釋在第一個右括號處終止。    bA(?#Matches words starting with A)w+b    

# [to end of line]    X 模式註解。 該註解以非轉義的 # 開頭,並繼續到行的結尾。    (?x)bAw+b#Matches words starting with A    

Regex 類別

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

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

序號

方法& 描述

1    public bool IsMatch( string input指定的輸入字串中找到匹配項。    

2    public bool IsMatch( string input, int startat ) 

指示 Regex 建構子中指定的正規表示式是否在指定的輸入字串中找到符合項,從字串中指定的開始位置開始。    

3    public static bool IsMatch( string input, string pattern ) 

指示指定的正規表示式是否在指定的輸入字串中找到符合項目。    

4    public MatchCollection Matches( string input ) 

在指定的輸入字串中搜尋正規表示式的所有符合項目。    

5    public string Replace( string input, string replacement ) 
在指定的輸入字串中,將所有符合正規表示式模式的所有符合的字串替換為指定的替換字串。    

6    public 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
登入後複製

 以上就是【c#教程】C# 正则表达式的内容,更多相关内容请关注PHP中文网(www.php.cn)!


相關標籤:
c#
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板