學習筆記:正則表達式
一. 正則表達式
正則表達式(Regex)是用來進行文本處理的技術,是語言無關的,在幾乎所有語言中都有實現。
一個正則表達式就是由普通的字符及特殊字符(稱為元字符符)組成的文字模式。該模式秒殺在查找文章主體時待匹配的一個或多個字符串。正則表達式作為一個模板,將某個字符模式與所搜索的字符串進行匹配。
正則表達式的常用元字符(全為英文狀態,注意可以代表的字符種類和個數):
元字符 |
含義 |
.(點) |
可以匹配除”\n”外的任意一個字符 |
[](中括號) |
可以匹配中括號內的任意一個字符 例如,"[abc]" 匹配"plain"中的"a" |
|(或符號) |
可以匹配或符號兩邊的任意一個字符,優先級比較低 匹配 x 或 y。例如 "z|food" 可匹配 "z" 或 "food"。 |
正則表達式的常用限定符(全為英文狀態):
元字符 |
含義 |
*(星號) |
其限定的表達式出現次數等於或大於0次 例如,"zo*"可以匹配"z"、"zoo" |
+(加號) |
其限定的表達式至少出現1次 例如,"zo+"可以匹配"zoo",但不匹配"z" |
?(問號) |
其限定的表達式出現1次或0次 例如,"a?ve?"可以匹配"never"中的"ve" |
{n} |
其限定的表達式出現次數確定n次(n≥0) |
{n,} |
其限定的表達式至少出現n次 |
{n,m} |
其限定的表達式出現的次數為≥n次,≤m次(m>n) |
還有幾個重要的符號:
符號 |
含義 |
^ (Shift+6) |
匹配輸入的開始位置 非的意思。例如[^a-z],匹配非a-z的一個字符。 |
$ (Shift+4) |
匹配輸入的結尾 |
\ |
將下一個字符標記為特殊字符或字面值 例如:想匹配”.”時或其他特殊字符時,需寫為的”\.” |
()(小括號) |
1. 改變優先級 2. 分組,提取信息 |
需要熟記一些簡寫:
\d = [0-9]
\D=[^0-9]
\s =空字符,如\n tab space等
\S=非空字符
\w 能組成詞的字符(字面、數字、中文或下划線等)
\W 非\w
正則表達式在.Net就是用字符串表示,這個字符串格式比較特殊,無論多么特殊,在C#語言看來都是普通的字符串,具體什么含義由Regex類內部進行語法分析。
正則表達式可以進行字符串的匹配、字符串的提取、字符串的替換。C#中分別對應正則表達式的三個重要方法。
1) IsMatch() 返回值為bool類型
格式:Regex.IsMatch("字符串", "正則表達式");
作用:判斷字符串是否符合模板要求
例如:bool b =Regex.IsMatch("bbbbg","^b.*g$");判斷字符串是否以b開頭且以g結尾,中間可以有其他字符,若正確返回true,否則else。
2) Match() 返回值為Match類型,只能匹配一個
Matches() 返回值為MatchCollection集合類型,匹配所有符合的
格式:Match match = Regex.Match("字符串", "正則表達式");
或MatchCollection matches= Regex. Matches ("字符串", "正則表達式");
作用:
①提取匹配的子字符串
②提取組。Groups的下標由1開始,0中存放match的value。
例如:
Match match = Regex.Match("age=30", @"^(.+)=(.+)$"); if (match.Success){ Console.WriteLine(match.Groups[0] .Value);//輸出匹配的子字符串 Console.WriteLine(match.Groups[1] .Value);//獲取第一個分組的內容 Console.WriteLine(match.Groups[2] .Value);//獲取第二個分組的內容 }
----------------------------------------------------------------------------------

MatchCollection matches = Regex.Matches("2010年10月10日", @"\d+"); for (int i = 0; i < matches.Count; i++) { Console.WriteLine(matches[i].Value); }
3) Replace() 返回值為string
兩種常用方式如下:

//將所有的空格替換為單個空格 string str = " aa afds fds f "; str = Regex.Replace(str, @"\s+", " "); Console.WriteLine(str); string str = "hello“welcome to ”beautiful “China”"; //hello"welcome to "beautiful "China" //$1表示引用第一組。$2表示用第二組。 string strresult = Regex.Replace(str, "“(.+?)”", "\"$1\""); Console.WriteLine(strresult);
貪婪模式與終結貪婪模式
實際應用有采集器(從某個網頁上采集郵箱、圖片或其他信息)、敏感詞過濾、UBB翻譯器。
采集郵箱:
保存圖片:
網址處理:
敏感詞過濾:
UBB翻譯:
一些常用的正則表達式
正則表達式用於字符串處理,表單驗證等場合,實用高效,但用到時總是不太把握,以致往往要上網查一番。我將一些常用的表達式收藏在這里,作備忘之用。本貼隨時會更新。
匹配中文字符的正則表達式: [\u4e00-\u9fa5]
匹配雙字節字符(包括漢字在內):[^\x00-\xff]
匹配空行的正則表達式:\n[\s| ]*
匹配HTML標記的正則表達式:/<(.*)>.*<\/\1>|<(.*) \/>/
匹配首尾空格的正則表達式:(^\s*)|(\s*$)
匹配Email地址的正則表達式:\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*
匹配網址URL的正則表達式:http://([\w-]+\.)+[\w-]+(/[\w- ./?%&=]*)?
補充:
^\d+$ //匹配非負整數(正整數 + 0)
^[0-9]*[1-9][0-9]*$ //匹配正整數
^((-\d+)|(0+))$ //匹配非正整數(負整數 + 0)
^-[0-9]*[1-9][0-9]*$ //匹配負整數
^-?\d+$ //匹配整數
^\d+(\.\d+)?$ //匹配非負浮點數(正浮點數 + 0)
^(([0-9]+\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\.[0-9]+)|([0-9]*[1-9][0-9]*))$ //匹配正浮點數
^((-\d+(\.\d+)?)|(0+(\.0+)?))$ //匹配非正浮點數(負浮點數 + 0)
^(-(([0-9]+\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\.[0-9]+)|([0-9]*[1-9][0-9]*)))$ //匹配負浮點數
^(-?\d+)(\.\d+)?$ //匹配浮點數
^[A-Za-z]+$ //匹配由26個英文字母組成的字符串
^[A-Z]+$ //匹配由26個英文字母的大寫組成的字符串
^[a-z]+$ //匹配由26個英文字母的小寫組成的字符串
^[A-Za-z0-9]+$ //匹配由數字和26個英文字母組成的字符串
^\w+$ //匹配由數字、26個英文字母或者下划線組成的字符串
^[\w-]+(\.[\w-]+)*@[\w-]+(\.[\w-]+)+$ //匹配email地址
^[a-zA-z]+://匹配(\w+(-\w+)*)(\.(\w+(-\w+)*))*(\?\S*)?$ //匹配url