項目中有些時候需要用到正則表達式,但是自己對正則表達式不熟悉,每次學習完,過一段時間(長時間)不用,就又忘了,每次需要用到的時候都需要百度下,比較麻煩,這裡把C#中經常用到的正則表達式做下總結。 正則表達式常用的環境 爬蟲、網站數據驗證、日誌分析、字元串替換、獲取子字元串、文本處理、字元串處理等 正 ...
項目中有些時候需要用到正則表達式,但是自己對正則表達式不熟悉,每次學習完,過一段時間(長時間)不用,就又忘了,每次需要用到的時候都需要百度下,比較麻煩,這裡把C#中經常用到的正則表達式做下總結。
正則表達式常用的環境
爬蟲、網站數據驗證、日誌分析、字元串替換、獲取子字元串、文本處理、字元串處理等
正則基礎
1. []方括弧表示匹配可以匹配方括弧中的任意點單個字元,方括弧只允許匹配單個字元。
2. | 或表示兩項之間的一個選擇,它不能和方括弧使用,只能和小括弧使用。
3. ()小括弧表示一個子表達式的開始和結束位置
4. ^ 否符號,如果用在方括弧內,“^”表示不想要匹配的字元。
5. . 點字元:匹配除換行符 \n 之外的任何單字元。要匹配 . ,請使用 \. 。
6. 定位符:定位符使您能夠將正則表達式固定到行首或行尾,^ 和 $ 分別指字元串的開始與結束
7. 限定符:限定符用來指定正則表達式的一個給定組件必須要出現多少次才能滿足匹配
- * 表示匹配前面的子表達式0次或多次
- ?表示匹配前面的子表達式0次或一次
- + 表示匹配前面的子表達式至少匹配一次
- {n} 表示匹配前面的子表達式n次
- {n,m} 表示匹配前面的子表達式從n次到m次
8. 轉義字元
- \d 匹配一個數字字元。等價於 [0-9]。
- \D 匹配一個非數字字元。等價於 [^0-9]。
- \s 匹配任何空白字元,包括空格、製表符、換頁符等等。等價於 [ \f\n\r\t\v]。
- \S 匹配任何非空白字元。等價於 [^ \f\n\r\t\v]。
- \w 匹配字母、數字、下劃線。等價於'[A-Za-z0-9_]'。
- \W 匹配非字母、數字、下劃線。等價於 '[^A-Za-z0-9_]'。
- \n 匹配一個換行符
- \r 匹配一個回車符
- \b 匹配一個單詞邊界,即字與空格間的位置。匹配單詞的開始或者結尾部分
- \B 匹配非單詞邊界 匹配單詞的中間部分,例如:匹配:Chapter中的apt,/\Bapt/
9. 捕獲組:除(Expression)和(?<name>Expression)語法外,其它的(?...)語法都不是捕獲組。
var str = "Is is the cost of of gasoline going up up"; var patt1 = @"\b([a-z]+) \1\b"; var matchDatas1 = Regex.Matches(str, patt1).Select(x => x.Value); Console.WriteLine(JsonConvert.SerializeObject(matchDatas1));//["of of","up up"]
捕獲組的順序是從左到右,從1開始,0代表整體,這裡的\1就是分組的第一個自匹配項,在Replace中可以用$1操作
string a = @"(020)76544567"; string b = @"\((\d{3})\)(\d{8})"; var c = new Regex(b); string d = c.Replace(a, "$0-$1-$2"); Console.WriteLine(d);//(020)76544567-020-76544567
10.選擇
用圓括弧將所有選擇項括起來,相鄰的選擇項之間用|分割。用圓括弧會有一個副作用,使相關的匹配會被緩存,緩存的數據會占用記憶體,降低匹配效率。此時可用?:放在第一個選項前來消除這種副作用。
可以使用非捕獲元字元 ?:、?= 或 ?! 來重寫捕獲,忽略對相關匹配的保存。
- (?:pattern)匹配pattern,但不捕獲匹配結果。'industr(?:y|ies)' 例如:匹配'industry'或'industries'。
- (?=pattern)零寬度正向預查,不捕獲匹配結果。例如,“Windows(?=95|98|NT|2000)”能匹配“Windows2000”中的“Windows”,但不能匹配“Windows3.1”中的“Windows”
- (?!pattern)正向否定預查,不捕獲匹配結果。例如,“Windows(?!95|98|NT|2000)”不能匹配“Windows2000”中的“Windows”,但能匹配“Windows3.1”中的“Windows”
常用正則表達式
1. 非空字元串,適用於匹配單詞,關鍵字等 @"\S+"
2. html標簽 @"<[^>]+>"
- 匹配帶連接的a標簽 @"<a[^>]*?href=(['""]?)(?<url>[^'""\s>]+)\1[^>]*>(?<text>(?:(?!</?a\b).)*)</a>"
- 匹配鏈接 "(href|src)\\s*=\\s*(?:\"(?<1>[^\"]*)\"|(?<1>\\S+))"
- 匹配圖片 "<img(.*?)>"
3. Email地址:@"\w+@(\w+\.)+\w{2,3}";
4. 功能變數名稱:@"[a-zA-Z0-9][-a-zA-Z0-9]{0,62}(\.[a-zA-Z0-9][-a-zA-Z0-9]{0,62})+\.?";
5. InternetURL:@"[a-zA-z]+://[^\s]*" 或 @"^http://([\w-]+\.)+[\w-]+(/[\w-./?%&=]*)?$";
6. 手機號碼:@"^([1][3,4,5,6,7,8,9])\d{9}$";
7. 國內電話號碼:@"\d{3}-\d{8}|\d{4}-\d{7}";
8. 身份證:@"(^\d{15}$)|(^\d{18}$)|(^\d{17}(\d|X|x)$)";
9. 強密碼(必須包含大小寫字母和數字的組合,不能使用特殊字元,長度在 6-10 之間):@"^(?=.*\d)(?=.*[a-z])(?=.*[A-Z])[a-zA-Z0-9]{6,10}$";
10. 簡單密碼:@"\w{6,10}";
11. 帳號是否合法(字母開頭,允許5-16位元組,允許字母數字下劃線):@"^[a-zA-Z][a-zA-Z0-9_]{4,15}$";
12. 錢:@"^[0-9]+(.[0-9]+)?$";
13. QQ:@"[1-9][0-9]{4,}";
13. 郵政編碼:@"[1-9]\d{5}(?!\d)";
14. IP:@"^\d{1,3}.\d{1,3}.\d{1,3}.\d{1,3}$";
15. 數字: @"^\d+$";
16. 字母:@"^[a-zA-Z]+$";