1、正則表達式是用來進行文本處理的技術,是與語言無關的一個正則表達式就是由普通字符以及特殊字符(稱為元字符)組成的文字模式
2、元字符
整數或者小數:^[0-9]+\.{0,1}[0-9]{0,2}$
只能輸入數字:"^[0-9]*$"。
只能輸入n位的數字:"^\d{n}$"。
只能輸入至少n位的數字:"^\d{n,}$"。
只能輸入m~n位的數字:。"^\d{m,n}$"
只能輸入零和非零開頭的數字:"^(0|[1-9][0-9]*)$"。
只能輸入有兩位小數的正實數:"^[0-9]+(.[0-9]{2})?$"。
只能輸入有1~3位小數的正實數:"^[0-9]+(.[0-9]{1,3})?$"。
只能輸入非零的正整數:"^\+?[1-9][0-9]*$"。
只能輸入非零的負整數:"^\-[1-9][]0-9"*$。
只能輸入長度為3的字符:"^.{3}$"。
只能輸入由26個英文字母組成的字符串:"^[A-Za-z]+$"。
只能輸入由26個大寫英文字母組成的字符串:"^[A-Z]+$"。
只能輸入由26個小寫英文字母組成的字符串:"^[a-z]+$"。
只能輸入由數字和26個英文字母組成的字符串:"^[A-Za-z0-9]+$"。
只能輸入由數字、26個英文字母或者下劃線組成的字符串:"^\w+$"。
驗證用戶密碼:"^[a-zA-Z]\w{5,17}$"正確格式為:以字母開頭,長度在6~18之間,只能包含字符、數字和下劃線。
驗證是否含有^%&'',;=?$\"等字符:"[^%&'',;=?$\x22]+"。
只能輸入漢字:"^[\u4e00-\u9fa5]{0,}$"
驗證Email地址:"^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$"。
驗證InternetURL:"^http://([\w-]+\.)+[\w-]+(/[\w-./?%&=]*)?$"。
驗證電話號碼:"^(\(\d{3,4}-)|\d{3.4}-)?\d{7,8}$"正確格式為:"XXX-XXXXXXX"、"XXXX- XXXXXXXX"、"XXX-XXXXXXX"、"XXX-XXXXXXXX"、"XXXXXXX"和"XXXXXXXX"。
驗證身份證號(15位或18位數字):"^\d{15}|\d{18}$"。
驗證一年的12個月:"^(0?[1-9]|1[0-2])$"正確格式為:"01"~"09"和"1"~"12"。
驗證一個月的31天:"^((0?[1-9])|((1|2)[0-9])|30|31)$"正確格式為;"01"~"09"和"1"~"31"。整數或者小數:^[0-9]+\.{0,1}[0-9]{0,2}$
只能輸入數字:"^[0-9]*$"。
只能輸入n位的數字:"^\d{n}$"。
只能輸入至少n位的數字:"^\d{n,}$"。
只能輸入m~n位的數字:。"^\d{m,n}$"
只能輸入零和非零開頭的數字:"^(0|[1-9][0-9]*)$"。
只能輸入有兩位小數的正實數:"^[0-9]+(.[0-9]{2})?$"。
只能輸入有1~3位小數的正實數:"^[0-9]+(.[0-9]{1,3})?$"。
只能輸入非零的正整數:"^\+?[1-9][0-9]*$"。
只能輸入非零的負整數:"^\-[1-9][]0-9"*$。
只能輸入長度為3的字符:"^.{3}$"。
只能輸入由26個英文字母組成的字符串:"^[A-Za-z]+$"。
只能輸入由26個大寫英文字母組成的字符串:"^[A-Z]+$"。
只能輸入由26個小寫英文字母組成的字符串:"^[a-z]+$"。
只能輸入由數字和26個英文字母組成的字符串:"^[A-Za-z0-9]+$"。
只能輸入由數字、26個英文字母或者下劃線組成的字符串:"^\w+$"。
驗證用戶密碼:"^[a-zA-Z]\w{5,17}$"正確格式為:以字母開頭,長度在6~18之間,只能包含字符、數字和下劃線。
驗證是否含有^%&'',;=?$\"等字符:"[^%&'',;=?$\x22]+"。
只能輸入漢字:"^[\u4e00-\u9fa5]{0,}$"
驗證Email地址:"^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$"。
驗證InternetURL:"^http://([\w-]+\.)+[\w-]+(/[\w-./?%&=]*)?$"。
驗證電話號碼:"^(\(\d{3,4}-)|\d{3.4}-)?\d{7,8}$"正確格式為:"XXX-XXXXXXX"、"XXXX- XXXXXXXX"、"XXX-XXXXXXX"、"XXX-XXXXXXXX"、"XXXXXXX"和"XXXXXXXX"。
驗證身份證號(15位或18位數字):"^\d{15}|\d{18}$"。
驗證一年的12個月:"^(0?[1-9]|1[0-2])$"正確格式為:"01"~"09"和"1"~"12"。
驗證一個月的31天:"^((0?[1-9])|((1|2)[0-9])|30|31)$"正確格式為;"01"~"09"和"1"~"31"。
3、Regex靜態類常用的4種情況
1) 判斷是否匹配:Regex.IsMatch("字符串","正則表達式");
IsMatch的正則表達式,一般要加^$,因為它是精確判斷是否匹配。
2) 字符串提取:Regex.Match("字符串","正則表達式"); 只能提取一次,一般也加^$
3) 字符串提取(循環提取所有匹配的):Regex.Matches("字符串","正則表達式");
Matches[在字符串中尋找要查找的內容]的時候,直接寫表達式,不需要^$
4) 字符串替換:Regex.Replace("字符串","匹配的正則","替換的正則");
4、練習
I) IsMatch
1) 判斷是否是合法的郵政編碼(6位數字)
Regex.IsMatch(s, @"^\d{6}$")
2) 判斷一個字符串是不是身份證號碼,即是否是15或18位數字
Regex.IsMatch(s, @"^\d{15}|\d{18}$")
分析: 匹配“以15位數字開始”或者“以18位數字結束”( | 的優先級最低,最後執行)
3) 判斷一個字符串是否是合法的Email地址
Regex.IsMatch(s, @"^\w+@\w+(\.\w+)+$")
4) 匹配IP地址,4段用.分割的最多三位數字。 192.168.54.77、333.333.333.333假設都是正確的
Regex.IsMatch(s, @"^\d{1,3}(\.\d{1,3}){3}$")
5) 判斷是否是合法的日期格式“2008-08-08”。四位數字-兩位數字-兩位數字
要求:年份必須是19**或者20**,月份必須在01--12,日必須在01-31
下面的寫法是錯誤的,因為|的優先級最低,如果你將並列的選項用括號括起來,判斷完數字後,會進行)、(的或運算,就亂了!
Regex.IsMatch(s, @"^(19|20)\d{2}-(0[1-9])|(1[0-2])-(0[1-9])|([12]\d)|(3[01])$")
正確的寫法!
Regex.IsMatch(s, @"^(19|20)\d{2}-(0[1-9]|1[0-2])-(0[1-9]|[12]\d|3[01])$")
6) 判斷是否是合法的url地址,http://www.test.com/a.htm?id=3&name=aaa(問號後面的可有可無)
Regex.IsMatch(s, @"^\w+://\w+(\.\w+)+(\?\w+=\w+(&\w+=\w+)*)?$")
II) Match & Matches
1) 從文件路徑中提取出文件名(包含後綴)
string s = "C:/funny/make/1.txt";
Match m=Regex.Match(s, @".+/(.+)");
if (m.Success)
{
Console.WriteLine(m.Groups[1].Value);
}
2) 從“June 26 , 1951”中提取出月份June來
string s = "June 26 , 1951";
Match m=Regex.Match(s, @"(\w+)\s+\d+.+\d+");
if (m.Success)
{
Console.WriteLine(m.Groups[1].Value);
}
Console.ReadKey();
3) 從Email中提取出用戶名和域名,比如從[email protected]中提取出test和163.com。
string s = "[email protected]";
Match m=Regex.Match(s, @"^(.+)@(.+)$");
string name = m.Groups[1].Value;
string field = m.Groups[2].Value;
Console.WriteLine("用戶名是{0},域名是{1}",name,field);
4) 從一段文本中提取所有的數字
string s = "大家好,我是Hebe,我22歲了,身高180,我們團隊有3個女女!";
MatchCollection mc= Regex.Matches(s, @"\d+");
foreach (Match m in mc)
{
Console.WriteLine(m.Value);
}
Console.ReadKey();
5) 從字符串中提取所有人名
string s = "大家好。我們是牛人。我是Jason。我是Jay。嗚嗚。fffff";
MatchCollection mc = Regex.Matches(s, @"我是(\w+)");
foreach (Match m in mc)
{
Console.WriteLine(m.Groups[1].Value);
}
Console.ReadKey();
6) 從一個網站頁面提取所有Email地址
StringBuilder sb = new StringBuilder();
//有問題的話把8080端口號加上,那個default網站的地址
string path = "http://localhost:8080/";
//創建WebClient
WebClient wc = new WebClient();
//注意編碼問題(!!!)
wc.Encoding = Encoding.UTF8;
//從網站下載字符串
string content=wc.DownloadString(path);
//要會寫正則
MatchCollection mc = Regex.Matches(content, @"\w+@\w+(\.\w)+");
foreach (Match m in mc)
{
if (m.Success)
{
sb.AppendLine(m.Value);
}
}
Console.WriteLine(sb.ToString());
Console.ReadKey();
7) 從網站抓取所有的圖片地址,下載到硬盤(網站所在目錄用Cassini搭建一個)
//默認網站所在的目錄
string address = "http://localhost:8080/";
WebClient wc = new WebClient();
wc.Encoding = Encoding.Default;
//取得網站的字符串信息
string str=wc.DownloadString(address);
//通過觀察,分析出圖片的存儲形式
MatchCollection mc = Regex.Matches(str, @"src=""(hotgirls/(\d{2}_\d{2}\.jpg))""");
foreach (Match m in mc)
{
//得到每一幅圖片的物理全路徑
string picAddr=Path.Combine(address,m.Groups[1].Value);
//下載圖片到自己指定的路徑(且圖片名稱與網站上圖片的名稱一樣)
wc.DownloadFile(picAddr, Path.Combine(@"E:",m.Groups[2].Value));
}
8) 抓取所有超鏈接
StringBuilder sb = new StringBuilder();
//默認網站所在的目錄
string address = "http://localhost:8080/";
WebClient wc = new WebClient();
wc.Encoding = Encoding.UTF8;
//取得網站的字符串信息
string str=wc.DownloadString(address);
//通過觀察,分析出圖片的存儲形式
//要非某一項的話(<a href=[^>]+>[^<]+</a>),^一定要用[]括起來
MatchCollection mc = Regex.Matches(str, @"<a href=[^>]+>[^<]+</a>");
foreach (Match m in mc)
{
sb.AppendLine(m.Value);
}
Console.WriteLine(sb.ToString());
Console.ReadKey();
III) Replace
1) 刪除所有連續的a,其實就是將連續的a替換為空字符串。
string s = "你aaa好aa哈哈a你";
s=Regex.Replace(s, @"a+", "");
Console.WriteLine(s);
Console.ReadKey();
2) 我的生日是05/21/2010耶”轉換為“我的生日是2010年05月21日���
string s = "我的生日是05/21/2010耶";
s=Regex.Replace(s, @"(\d{2})/(\d{2})/(\d{4})", "$3年$1月$2日");
Console.WriteLine(s);
Console.ReadKey();
3) hello 'welcome to' beautiful'China' 輸出 hello 【welcome to】 beautiful【China】
string s = " hello 'welcome to' beautiful'China' ";
//貪婪模式(?一般用來修飾+)
s=Regex.Replace(s, @"'(.+?)'", "【$1】");
Console.WriteLine(s);
Console.ReadKey();
4) http://www.test.com 替換為 <a href="http://www.test.com">http://www.test.com</a>
string s = "http://www.test.com";
s=Regex.Replace(s, @"(.+)", @"<a href=""$1"">$1</a>");
Console.WriteLine(s);
Console.ReadKey();
5) 將文本中連續的空格替換為一個空格.
“hello welcome to China.”→”hello welcome to China”
string s = "hello welcome to China.";
s=Regex.Replace(s, @"(\s)+", @"$1");
Console.WriteLine(s);
Console.ReadKey();
6) UBB翻譯
將[URL=http://www.linuxidc.com]Linux公社[/URL]替換為<a href="http://www.linuxidc.com">Linux公社</a>
string s = "[URL=http://www.linuxidc.com]Linux公社[/URL]";
string str = Regex.Replace(s, @".+=(.+)\](.+)\[.+", @"<a href=""$1"">$2</a>");
Console.WriteLine(str);
Console.ReadKey();
Linux正則表達式特性及BRE與ERE的區別 http://www.linuxidc.com/Linux/2014-03/99152.htm
grep使用簡明及正則表達式 http://www.linuxidc.com/Linux/2013-08/88534.htm
正則表達式的用法 http://www.linuxidc.com/Linux/2013-03/81897.htm
正則表達式之零寬斷言 http://www.linuxidc.com/Linux/2013-03/81897.htm
Linux中正則表達式與文件格式化處理命令(awk/grep/sed) http://www.linuxidc.com/Linux/2013-03/81018.htm
基礎正則表達式 http://www.linuxidc.com/Linux/2014-09/106296.htm
常用正則表達式整理 http://www.linuxidc.com/Linux/2014-10/108076.htm
更多詳情見請繼續閱讀下一頁的精彩內容: http://www.linuxidc.com/Linux/2015-01/111397p2.htm