歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> 正則表達式簡介與常用表達

正則表達式簡介與常用表達

日期:2017/3/1 9:35:13   编辑:Linux編程

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

Copyright © Linux教程網 All Rights Reserved