日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
C#正則表達(dá)式,你會幾個?

本文轉(zhuǎn)載自微信公眾號「CSharp編程大全」,作者 zls365  。轉(zhuǎn)載本文請聯(lián)系CSharp編程大全公眾號。

成都創(chuàng)新互聯(lián)公司專注為客戶提供全方位的互聯(lián)網(wǎng)綜合服務(wù),包含不限于做網(wǎng)站、成都網(wǎng)站制作、劍川網(wǎng)絡(luò)推廣、成都小程序開發(fā)、劍川網(wǎng)絡(luò)營銷、劍川企業(yè)策劃、劍川品牌公關(guān)、搜索引擎seo、人物專訪、企業(yè)宣傳片、企業(yè)代運(yùn)營等,從售前售中售后,我們都將竭誠為您服務(wù),您的肯定,是我們最大的嘉獎;成都創(chuàng)新互聯(lián)公司為所有大學(xué)生創(chuàng)業(yè)者提供劍川建站搭建服務(wù),24小時服務(wù)熱線:028-86922220,官方網(wǎng)址:www.cdcxhl.com

最近寫爬蟲時需要用到正則表達(dá)式,有段時間沒有使用正則表達(dá)式現(xiàn)在漸漸感覺有些淡忘,現(xiàn)在使用還需要去查詢一些資料。為了避免以后這樣的情況,在此記錄下正則表達(dá)式的一些基本使用方法附帶小的實例。讓以后在使用時能一目了然知道他的使用,為開發(fā)節(jié)約時間,同時也分享給大家。

正則元字符

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

常用元字符

懶惰限定符

捕獲分組

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

小試牛刀

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

其中常用方法:

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

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

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

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

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

字符串匹配:

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

實例代碼:

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

顯示結(jié)果:

字符串查找:

實例代碼:

 
 
 
 
  1. string RegexStr = string.Empty; 
  2. #region 字符串查找
  3. string LinkA = "百度";
  4. RegexStr = @"href=""[\S]+""";   // ""匹配"
  5. Match mt = Regex.Match(LinkA, RegexStr);
  6. Console.WriteLine("{0}。", LinkA);
  7. Console.WriteLine("獲得href中的值:{0}。", mt.Value);
  8. RegexStr = @"[\S]+";    //:匹配h除了2,3,4,5,6之中的值,:h匹配包含括號內(nèi)元素的字符
  9. Console.WriteLine("{0}。GetH1值:{1}", "

    標(biāo)題

    ", Regex.Match("

    標(biāo)題

    ", RegexStr, RegexOptions.IgnoreCase).Value);

  10. Console.WriteLine("{0}。GetH1值:{1}", "

    小標(biāo)

    ", Regex.Match("

    小標(biāo)

    ", RegexStr, RegexOptions.IgnoreCase).Value);

  11. //RegexOptions.IgnoreCase:指定不區(qū)分大小寫的匹配。
  12. RegexStr = @"ab\w+|ij\w{1,}";   //匹配ab和字母 或 ij和字母
  13. Console.WriteLine("{0}。多選結(jié)構(gòu):{1}", "abcd", Regex.Match("abcd", RegexStr).Value);
  14. Console.WriteLine("{0}。多選結(jié)構(gòu):{1}", "efgh", Regex.Match("efgh", RegexStr).Value);
  15. Console.WriteLine("{0}。多選結(jié)構(gòu):{1}", "ijk", Regex.Match("ijk", RegexStr).Value);
  16. RegexStr = @"張三?豐";    //?匹配前面的子表達(dá)式零次或一次。
  17. Console.WriteLine("{0}??蛇x項元素:{1}", "張三豐", Regex.Match("張三豐", RegexStr).Value);
  18. Console.WriteLine("{0}??蛇x項元素:{1}", "張豐", Regex.Match("張豐", RegexStr).Value);
  19. Console.WriteLine("{0}??蛇x項元素:{1}", "張飛", Regex.Match("張飛", RegexStr).Value);
  20. /* 
  21.  例如:
  22. July|Jul  可縮短為  July?
  23. 4th|4     可縮短為  4(th)?
  24. */
  25. //匹配特殊字符
  26. RegexStr = @"Asp\.net";    //匹配Asp.net字符,因為.是元字符他會匹配除換行符以外的任意字符。這里我們只需要他匹配.字符即可。所以需要轉(zhuǎn)義\.這樣表示匹配.字符
  27. Console.WriteLine("{0}。匹配Asp.net字符:{1}", "Java Asp.net SQLServer", Regex.Match("Java Asp.net SQLServer", RegexStr).Value);
  28. Console.WriteLine("{0}。匹配Asp.net字符:{1}", "C# Java", Regex.Match("C# Java", RegexStr).Value);
  29. #endregion

顯示結(jié)果:

貪婪與懶惰

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

顯示結(jié)果:

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

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

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

(exp)分組

在做爬蟲時我們經(jīng)常獲得A中一些有用信息。如href,title和顯示內(nèi)容等。

 
 
 
 
  1. string TaobaoLink = "淘寶";
  2. RegexStr = @"]+href=""(\S+)""[^>]+title=""([\s\S]+?)""[^>]+>(\S+)";
  3. Match mat = Regex.Match(TaobaoLink, RegexStr);
  4. for (int i = 0; i < mat.Groups.Count; i++)
  5. {
  6.     Console.WriteLine("第"+i+"組:"+mat.Groups[i].Value);
  7. }

顯示結(jié)果:

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

輸出結(jié)果共分為:4組。

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

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

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

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

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

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

 (?exp) 分組取名

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

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

顯示結(jié)果:

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

獲得頁面中A標(biāo)簽中href值

 
 
 
 
  1. string PageInfo = @"
  2.                         
  3.                             百度
  4.                             淘寶
  5.                             博客園
  6.                             google
  7.                         
  •                         
  •                             整租
  •                             合租
  •                             求租
  •                             二手房
  •                             商鋪出租
  •                         
  •                     ";
  • RegexStr = @"]+href=""(?[\S]+?)""[^>]*>(?[\S]+?)";
  • 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());
  • }
  • 顯示結(jié)果:

    Replace 替換字符串

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

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

    顯示結(jié)果:

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

    Split 拆分字符串

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

    顯示結(jié)果:

    根據(jù)數(shù)字截取字符串。


    文章名稱:C#正則表達(dá)式,你會幾個?
    網(wǎng)頁地址:http://www.5511xx.com/article/cdsccoc.html