項目中有些時候需要用到正則表達式,但是自己對正則表達式不熟悉,每次學習完,過一段時間(長時間)不用,就又忘了,每次需要用到的時候都需要百度下,比較麻煩,這里把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]+$";
17. 獲取Html中的文本內容
public static string GetHtmlText(string html) { html = Regex.Replace(html, @"<[^<>]+>", "", RegexOptions.IgnoreCase); html = html.Replace("\r\n", "").Replace("\r", "").Replace(" ", "").Replace(" ", ""); return html; }
18.隱藏手機號中間幾位數
Regex.Replace(手機號, "(\\d{3})\\d{4}(\\d{4})", "$1****$2");