最近寫爬蟲時需要用到正則表達式,有段時間沒有使用正則表達式現在漸漸感覺有些淡忘,現在使用還需要去查詢一些資料。為了避免以后這樣的情況,在此記錄下正則表達式的一些基本使用方法附帶小的實例。讓以后在使用時能一目了然知道他的使用,為開發節約時間,同時也分享給大家。
在說正則表達式之前我們先來看看通配符,我想通配符大家都用過。通配符主要有星號(*)和問號(?),用來模糊搜索文件。winodws中我們常會使用搜索來查找一些文件。如:*.jpg,XXX.docx的方式,來快速查找文件。其實正則表達式和我們通配符很相似也是通過特定的字符匹配我們所要查詢的內容信息。已下代碼都是區分大小寫。
常用元字符
| 代碼 | 說明 |
| . | 匹配除換行符以外的任意字符。 |
| /w | 匹配字母或數字或下劃線或漢字。 |
| /s | 匹配任意的空白符。 |
| /d | 匹配數字。 |
| /b | 匹配單詞的開始或結束。 |
| [ck] | 匹配包含括號內元素的字符 |
| ^ | 匹配行的開始。 |
| $ | 匹配行的結束。 |
| / | 對下一個字符轉義。比如$是個特殊的字符。要匹配$的話就得用/$ |
| | | 分支條件,如:x|y匹配 x 或 y。 |
反義元字符
| 代碼 | 說明 |
| /W | 匹配任意不是字母,數字,下劃線,漢字的字符。 |
| /S | 匹配任意不是空白符的字符。等價于 [^ /f/n/r/t/v]。 |
| /D | 匹配任意非數字的字符。等價于 [^0-9]。 |
| /B | 匹配不是單詞開頭或結束的位置。 |
| [^CK] | 匹配除了CK以外的任意字符。 |
特殊元字符
| 代碼 | 說明 |
| /f | 匹配一個換頁符。等價于 /x0c 和 /cL。 |
| /n | 匹配一個換行符。等價于 /x0a 和 /cJ。 |
| /r | 匹配一個回車符。等價于 /x0d 和 /cM。 |
| /t | 匹配一個制表符。等價于 /x09 和 /cI。 |
| /v | 匹配一個垂直制表符。等價于 /x0b 和 /cK。 |
限定符
| 代碼 | 說明 |
| * | 匹配前面的子表達式零次或多次。 |
| + | 匹配前面的子表達式一次或多次。 |
| ? | 匹配前面的子表達式零次或一次。 |
| {n} | n 是一個非負整數。匹配確定的 n 次。 |
| {n,} | n 是一個非負整數。至少匹配n 次。 |
| {n,m} | m 和 n 均為非負整數,其中n <= m。最少匹配 n 次且最多匹配 m 次。 |
懶惰限定符
| 代碼 | 說明 |
| *? | 重復任意次,但盡可能少重復。 如 "acbacb" 正則 "a.*?b" 只會取到第一個"acb" 原本可以全部取到但加了限定符后,只會匹配盡可能少的字符 ,而"acbacb"最少字符的結果就是"acb" 。 |
| +? | 重復1次或更多次,但盡可能少重復。與上面一樣,只是至少要重復1次。 |
| ?? | 重復0次或1次,但盡可能少重復。 如 "aaacb" 正則 "a.??b" 只會取到最后的三個字符"acb"。 |
| {n,m}? | 重復n到m次,但盡可能少重復。 如 "aaaaaaaa" 正則 "a{0,m}" 因為最少是0次所以取到結果為空。 |
| {n,}? | 重復n次以上,但盡可能少重復。 如 "aaaaaaa" 正則 "a{1,}" 最少是1次所以取到結果為 "a"。 |
捕獲分組
| 代碼 | 說明 |
| (exp) | 匹配exp,并捕獲文本到自動命名的組里。 |
| (?<name>exp) | 匹配exp,并捕獲文本到名稱為name的組里。 |
| (?:exp) | 匹配exp,不捕獲匹配的文本,也不給此分組分配組號以下為零寬斷言。 |
| (?=exp) | 匹配exp前面的位置。 如 "How are you doing" 正則"(?<txt>.+(?=ing))" 這里取ing前所有的字符,并定義了一個捕獲分組名字為 "txt" 而"txt"這個組里的值為"How are you do"; |
| (?<=exp) | 匹配exp后面的位置。 如 "How are you doing" 正則"(?<txt>(?<=How).+)" 這里取"How"之后所有的字符,并定義了一個捕獲分組名字為 "txt" 而"txt"這個組里的值為" are you doing"; |
| (?!exp) | 匹配后面跟的不是exp的位置。 如 "123abc" 正則 "/d{3}(?!/d)"匹配3位數字后非數字的結果 |
| (?<!exp) | 匹配前面不是exp的位置。 如 "abc123 " 正則 "(?<![0-9])123" 匹配"123"前面是非數字的結果也可寫成"(?!</d)123" |
得到上面秘籍后我們可以小試牛刀...
在C#中使用正則表達式主要是通過Regex類來實現。命名空間:using System.Text.RegularExPRessions。
其中常用方法:
| 名稱 | 說明 |
| IsMatch(String, String) | 指示Regex構造函數中指定的正則表達式在指定的輸入字符串中是否找到了匹配項。 |
| Match(String, String) | 在指定的輸入字符串中搜索Regex構造函數中指定的正則表達式的第一個匹配項。 |
| Matches(String, String) | 在指定的輸入字符串中搜索正則表達式的所有匹配項。 |
| Replace(String, String) | 在指定的輸入字符串內,使用指定的替換字符串替換與某個正則表達式模式匹配的所有字符串。 |
| Split(String, String) | 在由Regex構造函數指定的正則表達式模式所定義的位置,拆分指定的輸入字符串。 |
在使用正則表達式前我們先來看看“@”符號的使用。
學過C#的人都知道C# 中字符串常量可以以@ 開頭聲名,這樣的優點是轉義序列“不”被處理,按“原樣”輸出,即我們不需要對轉義字符加上 / (反斜扛),就可以輕松coding。如:
string filePath = @"c:/Docs/Source/CK.txt" // rather than "c://Docs//Source//CK.txt"
如要在一個用 @ 引起來的字符串中包括一個雙引號,就需要使用兩對雙引號了。這時候你不能使用 / 來轉義爽引號了,因為在這里 / 的轉義用途已經被 @ “屏蔽”掉了。如:
string str=@"""Ahoy!"" cried the captain." // 輸出為: "Ahoy!" cried the captain.
字符串匹配:
在實際項目中我們常常需要對用戶輸入的信息進行驗證。如:匹配用戶輸入的內容是否為數字,是否為有效的手機號碼,郵箱是否合法....等。
實例代碼:

string RegexStr = string.Empty;#region 字符串匹配RegexStr = "^[0-9]+$"; //匹配字符串的開始和結束是否為0-9的數字[定位字符]Console.WriteLine("判斷'R1123'是否為數字:{0}", Regex.IsMatch("R1123", RegexStr));Console.WriteLine("判斷'1123'是否為數字:{0}", Regex.IsMatch("1123", RegexStr));RegexStr = @"/d+"; //匹配字符串中間是否包含數字(這里沒有從開始進行匹配噢,任意位子只要有一個數字即可)Console.WriteLine("'R1123'是否包含數字:{0}", Regex.IsMatch("R1123", RegexStr));Console.WriteLine("'博客園'是否包含數字:{0}", Regex.IsMatch("博客園", RegexStr));//感謝@zhoumy的提醒..已修改錯誤代碼RegexStr = @"^Hello World[/w/W]*"; //已Hello World開頭的任意字符(/w/W:組合可匹配任意字符)Console.WriteLine("'HeLLO WORLD xx hh xx'是否已Hello World開頭:{0}", Regex.IsMatch("HeLLO WORLD xx hh xx", RegexStr, RegexOptions.IgnoreCase));Console.WriteLine("'LLO WORLD xx hh xx'是否已Hello World開頭:{0}", Regex.IsMatch("LLO WORLD xx hh xx", RegexStr,RegexOptions.IgnoreCase));//RegexOptions.IgnoreCase:指定不區分大小寫的匹配。#endregionView Code顯示結果:

字符串查找:
實例代碼:

string RegexStr = string.Empty; #region 字符串查找string LinkA = "<a href=/"http://www.baidu.com/" target=/"_blank/">百度</a>";RegexStr = @"href=""[/S]+"""; // ""匹配"Match mt = Regex.Match(LinkA, RegexStr);Console.WriteLine("{0}。", LinkA);Console.Write
新聞熱點
疑難解答