標籤:
Regex 是一種匹配輸入文本的模式。.Net 架構提供了允許這種匹配的Regex引擎。模式由一個或多個字元、運算子和結構組成。
下面列出了用於定義Regex的各種類別的字元、運算子和結構。
- 字元轉義
- 字元類
- 錨點
- 分組構造
- 限定符
- 反向引用構造
- 備用構造
- 替換
- 雜項構造
字元轉義
Regex中的反斜線字元(\)指示其後跟的字元是特殊字元,或應按原義解釋該字元。
下表列出了逸出字元:
逸出字元 |
描述 |
模式 |
匹配 |
\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" |
\ |
在後面帶有不識別的逸出字元時,與該字元匹配。 |
\d+[\+-x\*]\d+\d+[\+-x\*\d+ |
"(2+2) * 3*9" 中的 "2+2" 和 "3*9" |
字元類
字元類與一組字元中的任何一個字元匹配。
下表列出了字元類:
字元類 |
描述 |
模式 |
匹配 |
[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 |
與任何非空白字元匹配。 |
\s\S |
"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 |
匹配必須出現在字串的開頭。 |
\A\w{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 邊界上。 |
\Bend\w*\b |
"end sends endure lender" 中的 "ends" 和 "ender" |
分組構造
分組構造描述了Regex的子運算式,通常用於捕獲輸入字串的子字串。
下表列出了分組構造:
分組構造 |
描述 |
模式 |
匹配 |
( subexpression ) |
捕獲匹配的子運算式並將其分配到一個從零開始的序號中。 |
(\w)\1 |
"deep" 中的 "ee" |
(?< name >subexpression) |
將匹配的子運算式捕獲到一個命名組中。 |
(?< double>\w)\k< double> |
"deep" 中的 "ee" |
(?< name1 -name2 >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 中指定的選項。 |
A\d{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) |
零寬度正回顧後發斷言。 |
(?< =19)\d{2}\b |
"1851 1999 1950 1905 2003" 中的 "51" 和 "03" |
(?< ! subexpression) |
零寬度負回顧後發斷言。 |
(?< !19)\d{2}\b |
"end sends endure lender" 中的 "ends" 和 "ender" |
(?> 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" |
{ 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" |
反向引用構造
反向引用允許在同一Regex中隨後標識以前匹配的子運算式。
下表列出了反向引用構造:
反向引用構造 |
描述 |
模式 |
匹配 |
\ number |
反向引用。 匹配編號子運算式的值。 |
(\w)\1 |
"seek" 中的 "ee" |
\k< name > |
命名反向引用。 匹配命名運算式的值。 |
(?< char>\w)\k< char> |
"seek" 中的 "ee" |
備用構造
備用構造用於修改Regex以啟用 either/or 匹配。
下表列出了備用構造:
備用構造 |
描述 |
模式 |
匹配 |
| |
匹配以豎線 (|) 字元分隔的任何一個元素。 |
th(e|is|at) |
"this is the day. " 中的 "the" 和 "this" |
(?( expression )yes | no ) |
如果Regex模式由 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" |
替換
替換是替換模式中使用的Regex。
下表列出了用於替換的字元:
字元 |
描述 |
模式 |
替換模式 |
輸入字串 |
結果字串 |
$number |
替換按組 number 匹配的子字串。 |
\b(\w+)(\s)(\w+)\b |
$3$2$1 |
"one two" |
"two one" |
${name} |
替換按命名組 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+ |
$‘ |
"AABBCC" |
"AACCCC" |
$+ |
替換最後捕獲的組。 |
B+(C+) |
$+ |
"AABBCCDD" |
AACCDD |
$_ |
替換整個輸入字串。 |
B+ |
$_ |
"AABBCC" |
"AAAABBCCCC" |
雜項構造
下表列出了各種雜項構造:
構造 |
描述 |
執行個體 |
(?imnsx-imnsx) |
在模式中間對諸如不區分大小寫這樣的選項進行設定或禁用。 |
\bA(?i)b\w+\b 匹配 "ABA Able Act" 中的 "ABA" 和 "Able" |
(?#comment) |
內聯注釋。該注釋在第一個右括弧處終止。 |
\bA(?#Matches words starting with A)\w+\b |
# [to end of line] |
X 模式注釋。 該注釋以非轉義的 # 開頭,並繼續到行的結尾。 |
(?x)\bA\w+\b#Matches words starting with A |
Regex 類
Regex 類用於表示一個Regex。
下表列出了 Regex 類中一些常用的方法:
序號 |
方法 & 描述 |
1 |
public bool IsMatch( string input ) 指示 Regex 建構函式中指定的Regex是否在指定的輸入字串中找到匹配項。 |
2 |
public bool IsMatch( string input, int startat ) 指示 Regex 建構函式中指定的Regex是否在指定的輸入字串中找到匹配項,從字串中指定的開始位置開始。 |
3 |
public static bool IsMatch( string input, string pattern ) 指示指定的Regex是否在指定的輸入字串中找到匹配項。 |
4 |
public MatchCollection Matches( string input ) 在指定的輸入字串中搜尋Regex的所有匹配項。 |
5 |
public string Replace( string input, string replacement ) 在指定的輸入字串中,把所有匹配Regex模式的所有匹配的字串替換為指定的替換字串。 |
6 |
public string[] Split( string input ) 把輸入字串分割為子字串數組,根據在 Regex 建構函式中指定的Regex模式定義的位置進行分割。 |
如需瞭解 Regex 類的完整的屬性列表,請參閱微軟的 C# 文檔:https://msdn.microsoft.com/zh-cn/library/system.text.regularexpressions.regex(v=vs.110).aspx。
來源:http://www.runoob.com/csharp/csharp-regular-expressions.html
C# Regex總結