亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > regex > 正文

C# 正則表達式 使用介紹

2020-01-20 22:30:08
字體:
來源:轉載
供稿:網友

為了避免以后這樣的情況,在此記錄下正則表達式的一些基本使用方法附帶小的實例。讓以后在使用時能一目了然知道他的使用,為開發節約時間,同時也分享給大家

正則元字符

  在說正則表達式之前我們先來看看通配符,我想通配符大家都用過。通配符主要有星號(*)和問號(?),用來模糊搜索文件。winodws中我們常會使用搜索來查找一些文件。如:*.jpg,XXX.docx的方式,來快速查找文件。其實正則表達式和我們通配符很相似也是通過特定的字符匹配我們所要查詢的內容信息。已下代碼都是區分大小寫。

常用元字符

代碼 說明
.                      匹配除換行符以外的任意字符。
/w 匹配字母或數字或下劃線或漢字。
/s  匹配任意的空白符。
/d 匹配數字。
/b 匹配單詞的開始或結束。
[ck] 匹配包含括號內元素的字符
^ 匹配行的開始。
匹配行的結束。
/ 對下一個字符轉義。比如$是個特殊的字符。要匹配$的話就得用/$
| 分支條件,如:x|y匹配 x 或 y。

反義元字符

代碼 說明
/W              匹配任意不是字母,數字,下劃線,漢字的字符。
/S 匹配任意不是空白符的字符。等價于 [^ /f/n/r/t/v]。
/D 匹配任意非數字的字符。等價于 [^0-9]。
/B 匹配不是單詞開頭或結束的位置。
[^CK]  匹配除了CK以外的任意字符。

特殊元字符

代碼 說明
/f             匹配一個換頁符。等價于 /x0c 和 /cL。
/n 匹配一個換行符。等價于 /x0a 和 /cJ。
/r 匹配一個回車符。等價于 /x0d 和 /cM。
/t 匹配一個制表符。等價于 /x09 和 /cI。
/v 匹配一個垂直制表符。等價于 /x0b 和 /cK。

限定符

代碼 說明
*                       匹配前面的子表達式零次或多次。
+ 匹配前面的子表達式一次或多次。
? 匹配前面的子表達式零次或一次。
{n} n 是一個非負整數。匹配確定的 n 次。
{n,} n 是一個非負整數。至少匹配n 次。
{n,m} m 和 n 均為非負整數,其中n <= m。最少匹配 n 次且最多匹配 m 次。

懶惰限定符

代碼 說明
*?                                                 

重復任意次,但盡可能少重復。

如 "acbacb"  正則  "a.*?b" 只會取到第一個"acb" 原本可以全部取到但加了限定符后,只會匹配盡可能少的字符 ,而"acbacb"最少字符的結果就是"acb" 。

+? 重復1次或更多次,但盡可能少重復。與上面一樣,只是至少要重復1次。
??

重復0次或1次,但盡可能少重復。

如 "aaacb" 正則 "a.??b" 只會取到最后的三個字符"acb"。

{n,m}?

重復n到m次,但盡可能少重復。

如 "aaaaaaaa"  正則 "a{0,m}" 因為最少是0次所以取到結果為空。

{n,}?

重復n次以上,但盡可能少重復。

如 "aaaaaaa"  正則 "a{1,}" 最少是1次所以取到結果為 "a"。

捕獲分組

代碼 說明
(exp)                                                  匹配exp,并捕獲文本到自動命名的組里。
(?<name>exp) 匹配exp,并捕獲文本到名稱為name的組里。
(?:exp) 匹配exp,不捕獲匹配的文本,也不給此分組分配組號以下為零寬斷言。
(?=exp)

匹配exp前面的位置。

如 "How are you doing" 正則"(?<txt>.+(?=ing))" 這里取ing前所有的字符,并定義了一個捕獲分組名字為 "txt" 而"txt"這個組里的值為"How are you do";

(?<=exp)

匹配exp后面的位置。

如 "How are you doing" 正則"(?<txt>(?<=How).+)" 這里取"How"之后所有的字符,并定義了一個捕獲分組名字為 "txt" 而"txt"這個組里的值為" are you doing";

(?!exp)

匹配后面跟的不是exp的位置。

如 "123abc" 正則 "/d{3}(?!/d)"匹配3位數字后非數字的結果

(?<!exp)

匹配前面不是exp的位置。

如 "abc123 " 正則 "(?<![0-9])123" 匹配"123"前面是非數字的結果也可寫成"(?!</d)123"

得到上面秘籍后我們可以小試牛刀...

小試牛刀

在C#中使用正則表達式主要是通過Regex類來實現。命名空間:using System.Text.RegularExpressions。

其中常用方法:

名稱 說明
IsMatch(String, String) 指示 Regex 構造函數中指定的正則表達式在指定的輸入字符串中是否找到了匹配項。
Match(String, String) 在指定的輸入字符串中搜索 Regex 構造函數中指定的正則表達式的第一個匹配項。
Matches(String, String) 在指定的輸入字符串中搜索正則表達式的所有匹配項。
Replace(String, String) 在指定的輸入字符串內,使用指定的替換字符串替換與某個正則表達式模式匹配的所有字符串。
Split(String, String) 在由 Regex 構造函數指定的正則表達式模式所定義的位置,拆分指定的輸入字符串。

在使用正則表達式前我們先來看看“@”符號的使用。

學過C#的人都知道C# 中字符串常量可以以@ 開頭聲名,這樣的優點是轉義序列“不”被處理,按“原樣”輸出,即我們不需要對轉義字符加上 / (反斜扛),就可以輕松coding。如:

復制代碼 代碼如下:

string filePath = @"c:/Docs/Source/CK.txt" // rather than "c://Docs//Source//CK.txt"

如要在一個用 @ 引起來的字符串中包括一個雙引號,就需要使用兩對雙引號了。這時候你不能使用 / 來轉義爽引號了,因為在這里 / 的轉義用途已經被 @ “屏蔽”掉了。如:

復制代碼 代碼如下:

string str=@"""Ahoy!"" cried the captain." // 輸出為: "Ahoy!" cried the captain.

字符串匹配:

在實際項目中我們常常需要對用戶輸入的信息進行驗證。如:匹配用戶輸入的內容是否為數字,是否為有效的手機號碼,郵箱是否合法....等。

實例代碼:

string RegexStr = string.Empty;#region 字符串匹配RegexStr = "^[0-9]+$"; //匹配字符串的開始和結束是否為0-9的數字[定位字符]Console.WriteLine("判斷'R1123'是否為數字:{0}", Regex.IsMatch("R1123", RegexStr));Console.WriteLine("判斷'1123'是否為數字:{0}", Regex.IsMatch("1123", RegexStr));RegexStr = @"/d+"; //匹配字符串中間是否包含數字(這里沒有從開始進行匹配噢,任意位子只要有一個數字即可)Console.WriteLine("'R1123'是否包含數字:{0}", Regex.IsMatch("R1123", RegexStr));Console.WriteLine("'博客園'是否包含數字:{0}", Regex.IsMatch("博客園", RegexStr));//感謝@zhoumy的提醒..已修改錯誤代碼RegexStr = @"^Hello World[/w/W]*"; //已Hello World開頭的任意字符(/w/W:組合可匹配任意字符)Console.WriteLine("'HeLLO WORLD xx hh xx'是否已Hello World開頭:{0}", Regex.IsMatch("HeLLO WORLD xx hh xx", RegexStr, RegexOptions.IgnoreCase));Console.WriteLine("'LLO WORLD xx hh xx'是否已Hello World開頭:{0}", Regex.IsMatch("LLO WORLD xx hh xx", RegexStr,RegexOptions.IgnoreCase));//RegexOptions.IgnoreCase:指定不區分大小寫的匹配。#endregion

顯示結果:

字符串查找:

實例代碼:

string RegexStr = string.Empty; #region 字符串查找string LinkA = "<a href=/"http://www.baidu.com/" target=/"_blank/">百度</a>";RegexStr = @"href=""[/S]+"""; // ""匹配"Match mt = Regex.Match(LinkA, RegexStr);Console.WriteLine("{0}。", LinkA);Console.WriteLine("獲得href中的值:{0}。", mt.Value);RegexStr = @"<h[^23456]>[/S]+<h[1]>"; //<h[^23456]>:匹配h除了2,3,4,5,6之中的值,<h[1]>:h匹配包含括號內元素的字符Console.WriteLine("{0}。GetH1值:{1}", "<H1>標題<H1>", Regex.Match("<H1>標題<H1>", RegexStr, RegexOptions.IgnoreCase).Value);Console.WriteLine("{0}。GetH1值:{1}", "<h2>小標<h2>", Regex.Match("<h2>小標<h2>", RegexStr, RegexOptions.IgnoreCase).Value);//RegexOptions.IgnoreCase:指定不區分大小寫的匹配。RegexStr = @"ab/w+|ij/w{1,}"; //匹配ab和字母 或 ij和字母Console.WriteLine("{0}。多選結構:{1}", "abcd", Regex.Match("abcd", RegexStr).Value);Console.WriteLine("{0}。多選結構:{1}", "efgh", Regex.Match("efgh", RegexStr).Value);Console.WriteLine("{0}。多選結構:{1}", "ijk", Regex.Match("ijk", RegexStr).Value);RegexStr = @"張三?豐"; //?匹配前面的子表達式零次或一次。Console.WriteLine("{0}??蛇x項元素:{1}", "張三豐", Regex.Match("張三豐", RegexStr).Value);Console.WriteLine("{0}。可選項元素:{1}", "張豐", Regex.Match("張豐", RegexStr).Value);Console.WriteLine("{0}。可選項元素:{1}", "張飛", Regex.Match("張飛", RegexStr).Value);/*  例如:July|Jul  可縮短為  July?4th|4   可縮短為  4(th)?*///匹配特殊字符RegexStr = @"Asp/.net"; //匹配Asp.net字符,因為.是元字符他會匹配除換行符以外的任意字符。這里我們只需要他匹配.字符即可。所以需要轉義/.這樣表示匹配.字符Console.WriteLine("{0}。匹配Asp.net字符:{1}", "Java Asp.net SQLServer", Regex.Match("Java Asp.net SQLServer", RegexStr).Value);Console.WriteLine("{0}。匹配Asp.net字符:{1}", "C# Java", Regex.Match("C# Java", RegexStr).Value);#endregion

顯示結果:

貪婪與懶惰

string f = "fooot";//貪婪匹配RegexStr = @"f[o]+";Match m1 = Regex.Match(f, RegexStr);Console.WriteLine("{0}貪婪匹配(匹配盡可能多的字符):{1}", f, m1.ToString());//懶惰匹配RegexStr = @"f[o]+?";Match m2 = Regex.Match(f, RegexStr);Console.WriteLine("{0}懶惰匹配(匹配盡可能少重復):{1}", f, m2.ToString());

顯示結果:

從上面的例子中我們不難看出貪婪與懶惰的區別,他們的名子取的都很形象。

貪婪匹配:匹配盡可能多的字符。

懶惰匹配:匹配盡可能少的字符。

(exp)分組

在做爬蟲時我們經常獲得A中一些有用信息。如href,title和顯示內容等。

string TaobaoLink = "<a href=/"http://www.taobao.com/" title=/"淘寶網 - 淘!我喜歡/" target=/"_blank/">淘寶</a>";RegexStr = @"<a[^>]+href=""(/S+)""[^>]+title=""([/s/S]+?)""[^>]+>(/S+)</a>";Match mat = Regex.Match(TaobaoLink, RegexStr);for (int i = 0; i < mat.Groups.Count; i++){ Console.WriteLine("第"+i+"組:"+mat.Groups[i].Value);}

顯示結果:

在正則表達式里使用()包含的文本自動會命名為一個組。上面的表達式中共使用了4個()可以認為是分為了4組。

輸出結果共分為:4組。

0組:為我們所匹配的字符串。

1組:是我們第一個括號[href=""(/S+)""]中(/S+)所匹配的網址信息。內容為:http://www.taobao.com。

2組:是第二個括號[title=""([/s/S]+?)""]中所匹配的內容信息。內容為:淘寶網 - 淘!我喜歡。

這里我們會看到+?懶惰限定符。title=""([/s/S]+?)"" 這里+?的下一個字符為"雙引號,"雙引號在匹配字符串后面還有三個。+?懶惰限定符會盡可能少重復,所他會匹配最前面那個"雙引號。如果我們不使用+?懶惰限定符他會匹配到:淘寶網 - 淘!我喜歡" target= 會盡可能多重復匹配。


3組:是第三個括號[(/S+)]所匹配的內容信息。內容為:淘寶。

說明:反義元字符所對應的元字符都能組合匹配任意字符。如:[/w/W],[/s/S],[/d/D]..

(?<name>exp) 分組取名

當我們匹配分組信息過多后,在某種場合只需取當中某幾組信息。這時我們可以對分組取名。通過分組名稱來快速提取對應信息。

string Resume = "基本信息姓名:CK|求職意向:.NET軟件工程師|性別:男|學歷:本專|出生日期:1988-08-08|戶籍:湖北.孝感|E - Mail:9245162@qq.com|手機:15000000000";RegexStr = @"姓名:(?<name>[/S]+)/|/S+性別:(?<sex>[/S]{1})/|學歷:(?<xueli>[/S]{1,10})/|出生日期:(?<Birth>[/S]{10})/|[/s/S]+手機:(?<phone>[/d]{11})";Match matc = Regex.Match(Resume, RegexStr);Console.WriteLine("姓名:{0},手機號:{1}", matc.Groups["name"].ToString(), matc.Groups["phone"].ToString());

顯示結果:

通過(?<name>exp)可以很輕易為分組取名。然后通過Groups["name"]取得分組值。

獲得頁面中A標簽中href值

string PageInfo = @"<hteml>      <div id=""div1"">       <a href=""http://www.baidu.con"" target=""_blank"">百度</a>       <a href=""http://www.taobao.con"" target=""_blank"">淘寶</a>       <a href=""http://www.cnblogs.com"" target=""_blank"">博客園</a>       <a href=""http://www.google.con"" target=""_blank"">google</a>      </div>      <div id=""div2"">       <a href=""/zufang/"">整租</a>       <a href=""/hezu/"">合租</a>       <a href=""/qiuzu/"">求租</a>       <a href=""/ershoufang/"">二手房</a>       <a href=""/shangpucz/"">商鋪出租</a>      </div>     </hteml>";RegexStr = @"<a[^>]+href=""(?<href>[/S]+?)""[^>]*>(?<text>[/S]+?)</a>";MatchCollection mc = Regex.Matches(PageInfo, RegexStr);foreach (Match item in mc){ Console.WriteLine("href:{0}--->text:{1}",item.Groups["href"].ToString(),item.Groups["text"].ToString());}

顯示結果:

Replace 替換字符串

用戶在輸入信息時偶爾會包含一些敏感詞,這時我們需要替換這個敏感詞。

string PageInputStr = "靠.TMMD,今天真不爽....";RegexStr = @"靠|TMMD|媽的";Regex rep_regex = new Regex(RegexStr);Console.WriteLine("用戶輸入信息:{0}", PageInputStr);Console.WriteLine("頁面顯示信息:{0}", rep_regex.Replace(PageInputStr, "***"));

顯示結果:

對一些敏感詞直接替換成***代替。

Split 拆分字符串

string SplitInputStr = "1xxxxx.2ooooo.3eeee.4kkkkkk.";RegexStr = @"/d";Regex spl_regex = new Regex(RegexStr);string[] str = spl_regex.Split(SplitInputStr);foreach (string item in str){ Console.WriteLine(item);}

顯示結果:

根據數字截取字符串。

首先,我們先看幾個實際的例子: 
1.    驗證輸入字符是否
javascript:
var ex = "^//w+$";
var re = new RegExp(ex,"i");
return re.test(str);

         VBScript

Dim regEx,flag,ex

ex = "^/w+$"

Set regEx = New RegExp

regEx.IgnoreCase = True 

regEx.Global = True 

regEx.Pattern = ex

flag = regEx.Test( str )

              C#

System.String ex = @"^/w+$";

              System.Text.RegularExpressions.Regex reg = new Regex( ex );                           
              bool flag = reg.IsMatch( str );

2.    驗證郵件格式

C#

System.String ex = @"^/w+@/w+/./w+$";

System.Text.RegularExpressions.Regex reg = new Regex( ex );

bool flag = reg.IsMatch( str );

3.    更改日期的格式(用 dd-mm-yy 的日期形式代替 mm/dd/yy 的日期形式)

C#

String MDYToDMY(String input) 

   {

      return Regex.Replace(input, 

         "http://b(?//d{1,2})/(?//d{1,2})/(?//d{2,4})//b",

         "${day}-${month}-${year}");

   }

4.    從 URL 提取協議和端口號

C#

String Extension(String url) 

   {

      Regex r = new Regex(@"^(?/w+)://[^/]+?(?:/d+)?/",

         RegexOptions.Compiled);

      return r.Match(url).Result("${proto}${port}"); 

   }

這里的例子可能是我們在網頁開發中,通常會碰到的一些正則表達式,尤其在第一個例子中,給出了使用javascript,vbScript,C#等不同語言的實現方式,大家不難看出,對于不同的語言來說,正則表達式沒有區別,只是正則表達式的實現類不同而已。而如何發揮正則表達式的公用,也要看實現類的支持。

(摘自msdn: Microsoft .NET 框架 SDK 提供大量的正則表達式工具,使您能夠高效地創建、比較和修改字符串,以及迅速地分析大量文本和數據以搜索、移除和替換文本模式。ms-help://MS.VSCC/MS.MSDNVS.2052/cpgenref/html/cpconregularexpressionslanguageelements.htm)

下面我們逐個來分析這些例子:

1-2,這兩個例子很簡單,只是簡單的驗證字符串是否符合正則表達式規定的格式,其中使用的語法,在第一篇文章中都已經介紹過了,這里做一下簡單的描述。

第1個例子的表達式:  ^/w+$

^ -- 表示限定匹配開始于字符串的開始

         /w 亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

欧美一级高清免费播放| 亚洲激情电影中文字幕| 国产精品成人v| 亚洲国产99精品国自产| 久久中文字幕视频| 成人伊人精品色xxxx视频| 亚洲一区二区久久久久久久| 欧美性猛交xxxxx免费看| 国产精品18久久久久久首页狼| 久久久久久久亚洲精品| 久久精品亚洲一区| 91情侣偷在线精品国产| 一区二区三区视频在线| 国产精品手机播放| 久久久久久久色| 中文字幕日韩精品在线| 亚洲国产小视频在线观看| 欧美最猛性xxxx| 日韩综合视频在线观看| 国产91成人在在线播放| 黑人巨大精品欧美一区二区三区| 亚洲人成网站色ww在线| 这里精品视频免费| 国产美女91呻吟求| 91夜夜未满十八勿入爽爽影院| 日韩在线观看视频免费| 91美女高潮出水| 欧美日韩中文在线观看| 精品女厕一区二区三区| 欧美日韩国产精品一区| 久久国产精品偷| 亚洲国产精品大全| 国产精品高潮呻吟久久av野狼| 欧美性一区二区三区| 国产一区二区三区免费视频| 黑人精品xxx一区一二区| 97av视频在线| 欧美日韩中文字幕日韩欧美| 成人性教育视频在线观看| 国产一区二区三区在线播放免费观看| 久久久免费高清电视剧观看| 91最新在线免费观看| 久久99热精品这里久久精品| 亚洲一区中文字幕| 国产国语videosex另类| 亚洲欧洲一区二区三区在线观看| 搡老女人一区二区三区视频tv| 一区二区亚洲欧洲国产日韩| 亚洲欧美日韩天堂一区二区| 高清欧美一区二区三区| 久久久久久久香蕉网| 欧美激情按摩在线| 中文字幕欧美日韩| 91精品视频免费看| 日韩电影在线观看中文字幕| 久久成人亚洲精品| 亚洲欧洲日本专区| 国内精品视频久久| 欧美在线一级视频| 久久精品视频网站| 91精品在线观看视频| 91国语精品自产拍在线观看性色| 欧美激情日韩图片| 亚洲欧美日韩国产精品| 91国语精品自产拍在线观看性色| 日韩电影第一页| 欧美日韩美女在线观看| 亚洲视频电影图片偷拍一区| 国产精品国内视频| 日韩精品久久久久久久玫瑰园| 国产丝袜一区二区| 久久久久中文字幕| 国产丝袜一区视频在线观看| 亚洲片在线观看| 国产精彩精品视频| 中文字幕久久亚洲| 久久久久久久久久久免费精品| 亚洲精品aⅴ中文字幕乱码| xxxxx成人.com| 亚洲欧洲成视频免费观看| 亚洲国产日韩欧美在线图片| 日韩中文第一页| 国产91精品在线播放| 91在线精品播放| 成人黄色在线免费| 亚洲sss综合天堂久久| 欧美大片大片在线播放| 亚洲二区在线播放视频| 色七七影院综合| 91视频国产精品| 亚洲精品久久久久中文字幕欢迎你| 国产日韩欧美日韩大片| 九九久久精品一区| 法国裸体一区二区| 欧美成人全部免费| 成人黄色在线免费| 日韩激情av在线播放| 欧美精品国产精品日韩精品| 国产一区二区成人| 国产欧美日韩91| 国产精品1区2区在线观看| 欧美亚洲成人精品| 国产精品一区久久| 亚洲电影成人av99爱色| 欧洲s码亚洲m码精品一区| 国产福利精品视频| 91高潮精品免费porn| 91精品综合久久久久久五月天| 国内精品免费午夜毛片| 亚洲国产精品久久久久秋霞蜜臀| 亚洲视频在线观看| 欧美日韩一区二区精品| 成人黄色短视频在线观看| 97久久超碰福利国产精品…| 欧美大尺度激情区在线播放| 91精品久久久久久久久中文字幕| 久久艹在线视频| 国产精品老女人精品视频| 中文字幕精品久久久久| 久久久久国产精品免费网站| 亚洲国产精品美女| 日韩在线资源网| 亚洲精品中文字幕女同| 欧美日本精品在线| 国产欧美日韩中文字幕| 国产亚洲综合久久| 国产成人精品在线观看| 91在线观看免费高清| 久久久久久一区二区三区| 亚洲夜晚福利在线观看| 欧美激情一级二级| 日韩激情av在线免费观看| 日韩成人在线电影网| 国产精品盗摄久久久| 96国产粉嫩美女| 大伊人狠狠躁夜夜躁av一区| 亚洲天堂色网站| 中文字幕精品一区久久久久| 午夜精品久久久久久久男人的天堂| 亚洲视频日韩精品| 国产精品亚洲视频在线观看| 国产日韩在线视频| 国产精品久久久久久久久免费看| 国产欧美最新羞羞视频在线观看| 国产成人亚洲综合91精品| 久久亚洲私人国产精品va| 国产精品丝袜一区二区三区| 国产美女精品免费电影| 国产视频丨精品|在线观看| 亚洲欧美日韩网| 国产精品老女人精品视频| 亚洲娇小xxxx欧美娇小| 免费不卡欧美自拍视频| 精品无人区乱码1区2区3区在线| 亚洲色图综合久久| 中日韩午夜理伦电影免费| 欧美精品电影免费在线观看| 亚洲成人999| 国产精品中文字幕久久久| 国a精品视频大全| 成人黄色免费网站在线观看| 亚洲美女精品久久| 国产精品国产三级国产专播精品人| 亚洲国产欧美自拍|