乡下人产国偷v产偷v自拍,国产午夜片在线观看,婷婷成人亚洲综合国产麻豆,久久综合给合久久狠狠狠9

  • <output id="e9wm2"></output>
    <s id="e9wm2"><nobr id="e9wm2"><ins id="e9wm2"></ins></nobr></s>

    • 分享

      正則表達(dá)式初探

       Coder編程 2020-05-13

      本章主要想和大家分享下正則表達(dá)式的一些基礎(chǔ)用法,希望能夠?qū)σ恍┬“子兴鶐椭?,也為了防止自己以后遺忘相關(guān)知識(shí)點(diǎn),下面我們正式進(jìn)入主題。

      一、正則表達(dá)式

        1、正則表達(dá)式是由普通字符(例如字符 a 到 z)以及特殊字符(稱為元字符)組成的文字模式。
        2、正則表達(dá)式作為一個(gè)模板,將某個(gè)字符模式與所搜索的字符串進(jìn)行匹配。
        3、在編寫(xiě)處理字符串的程序或網(wǎng)頁(yè)時(shí),經(jīng)常會(huì)有查找或替換符合某些復(fù)雜規(guī)則的字符串的需要。
        4、正則表達(dá)式就是記錄文本規(guī)則的代碼。

        作用:
          1、查找數(shù)據(jù)
          2、替換數(shù)據(jù)

        正則表達(dá)式能做什么(字符串的匹配、字符串的提取、字符串的替換

      二、正則表達(dá)式的構(gòu)成

        1、普通字符(如果直接寫(xiě)多個(gè)普通字符,則會(huì)被當(dāng)做一個(gè)整體的字符串來(lái)匹配)

          這包括所有的大小寫(xiě)字母字符,所有數(shù)字,所有標(biāo)點(diǎn)符號(hào)以及一些特殊符號(hào)。
          例如:Hello world xyh666

        2、定義字符集(取值范圍(該點(diǎn)都是匹配單個(gè)字符,要想匹配字符串需要結(jié)合限定符來(lái)實(shí)現(xiàn))
          [a-e] 表示a到e這些字符中的某一個(gè)字符
          [aeiou] 表示aeiou這5個(gè)字符其中的某一個(gè)字符
          [a-zA-Z] 表示大寫(xiě)、小寫(xiě)字母中的某一個(gè)字符
          [0-9] 表示0到9之間某一個(gè)數(shù)字

          代表非
          [^lsjd]  :不是中括號(hào)中的任意一個(gè)字符
          [^a-f]  :a-f范圍外的任意一個(gè)字符

        3、組合字符(大寫(xiě)表示非)(該點(diǎn)都是匹配單個(gè)字符,要想匹配字符串需要結(jié)合限定符來(lái)實(shí)現(xiàn))

          \d  :匹配一個(gè)數(shù)字字符。等價(jià)于[0-9]。
          \D  :匹配一個(gè)非數(shù)字字符。等價(jià)于[^0-9]。
          \w  :匹配一個(gè)字母或一個(gè)數(shù)字或一個(gè)下劃線或一個(gè)漢字。
          \W  :匹配一個(gè)非字母、非數(shù)字、非下劃線和非漢字的字符。
          \s  :匹配一個(gè)任意的空白符,包括空格、制表符、換頁(yè)符等等。等價(jià)于[ \f\n\r\t\v]。
          \S  :匹配任意一個(gè)非空白符。等價(jià)于[^ \f\n\r\t\v]。
          \b  :匹配單詞的開(kāi)始或結(jié)束的位置。
          \B  :匹配不是單詞開(kāi)頭或結(jié)束的位置。

        4、特殊字符

          $  :表示字符串的結(jié)尾位置(以什么結(jié)尾)
           :表示字符串的開(kāi)始位置(以什么開(kāi)始)(在取值范圍中還表示非)
           :一個(gè)點(diǎn)表示匹配一個(gè)除換行符 \n之外的任何單字符(匹配單個(gè)字符,要想匹配字符串需要結(jié)合限定符來(lái)實(shí)現(xiàn))
          或者的意思,指明兩項(xiàng)之間的一個(gè)選擇 與[...]類似
           :這個(gè)符號(hào)是用來(lái)轉(zhuǎn)義
          ( ) 分組,標(biāo)記一個(gè)子表達(dá)式的開(kāi)始和結(jié)束位置

        5、常用限定符
          =================匹配次數(shù)=================
          {m}  :其前一單元嚴(yán)格出現(xiàn)m次(重復(fù)m次)
          {m,}  :其前一單元出現(xiàn)至少m次(重復(fù)m次或更多次)
          {m,n}  :其前一單元出現(xiàn)至少m次,最多n次(重復(fù)m到n次)
          =======================================
          =================多次匹配=================
            :其前面那個(gè)單元出現(xiàn)0次或任意次數(shù)(重復(fù)零次或更多次)
            : 其前面那個(gè)單元出現(xiàn)1次或1次以上 至少匹配一次(重復(fù)一次或更多次)
          ?  : 其前面那個(gè)單元出現(xiàn)0次或1次(重復(fù)零次或一次)懶惰匹配(盡可能短匹配)
          =======================================
        6、貪婪與懶惰(貪婪模式和非貪婪模式)(盡可能長(zhǎng)匹配和盡可能短匹配)
          *? 重復(fù)任意次,但盡可能少重復(fù)
          +? 重復(fù)1次或更多次,但盡可能少重復(fù)
          ?? 重復(fù)0次或1次,但盡可能少重復(fù)
          {n,m}? 重復(fù)n到m次,但盡可能少重復(fù)
          {n,}? 重復(fù)n次以上,但盡可能少重復(fù)

        7、分組

          當(dāng)用()定義了一個(gè)正則表達(dá)式組后,正則引擎則會(huì)把被匹配的組按照順序編號(hào),存入緩存。

          默認(rèn)情況下,每個(gè)分組會(huì)自動(dòng)擁有一個(gè)組號(hào),規(guī)則是:從左向右,以分組的左括號(hào)為標(biāo)志,第一個(gè)出現(xiàn)的分組的組號(hào)為1,第二個(gè)為2,以此類推。

          我們可以通過(guò)“\數(shù)字”的方式進(jìn)行引用已經(jīng)存入緩存的組。\1引用第一個(gè)匹配的組,\2引用第二個(gè)組,以此類推。

          括號(hào)內(nèi)的內(nèi)容會(huì)被當(dāng)成一個(gè)整體進(jìn)行匹配。

        8、非獲取匹配和預(yù)查(零寬斷言)

          非獲取匹配:是指正則引擎不會(huì)把被匹配的組存入緩存,我們也無(wú)法通過(guò)“\數(shù)字”的方式進(jìn)行引用我們的組。

          預(yù)查預(yù)查不消耗字符,也就是說(shuō),在一個(gè)匹配發(fā)生后,在最后一次匹配之后立即開(kāi)始下一次匹配的搜索,而不是從包含預(yù)查的字符之后開(kāi)始。(即用來(lái)預(yù)查的表達(dá)式字符串不會(huì)被消耗,它只是用于指定一個(gè)位置

          零寬斷言:用于查找在某些內(nèi)容(但并不包括這些內(nèi)容)之前或之后的東西,也就是說(shuō)它們像\b,^,$那樣用于指定一個(gè)位置,這個(gè)位置應(yīng)該滿足一定的條件(即斷言),因此它們也被稱為零寬斷言。

          ===========================================================================================

          (?=exp)也叫零寬度正預(yù)測(cè)先行斷言,它斷言自身出現(xiàn)的位置的后面能匹配表達(dá)式exp。比如\b\w+(?=ing\b),匹配以ing結(jié)尾的單詞的前面部分(除了ing以外的部分),如查找I'm singing while you're dancing.時(shí),它會(huì)匹配sing和danc。

          (?<=exp)也叫零寬度正回顧后發(fā)斷言,它斷言自身出現(xiàn)的位置的前面能匹配表達(dá)式exp。比如(?<=\bre)\w+\b會(huì)匹配以re開(kāi)頭的單詞的后半部分(除了re以外的部分),例如在查找reading a book時(shí),它匹配ading。

          ===========================================================================================

          (?:pattern) 非獲取匹配,匹配pattern但不獲取匹配結(jié)果,不進(jìn)行存儲(chǔ)供以后使用。這在使用或字符“(|)”來(lái)組合一個(gè)模式的各個(gè)部分時(shí)很有用。例如“industr(?:y|ies)”就是一個(gè)比“industry|industries”更簡(jiǎn)略的表達(dá)式。

          (?=pattern) 非獲取匹配,正向肯定預(yù)查,在任何匹配pattern的字符串開(kāi)始處匹配查找字符串,該匹配不需要獲取供以后使用。例如,“Windows(?=95|98|NT|2000)”能匹配“Windows2000”中的“Windows”,但不能匹配“Windows3.1”中的“Windows”。預(yù)查不消耗字符,也就是說(shuō),在一個(gè)匹配發(fā)生后,在最后一次匹配之后立即開(kāi)始下一次匹配的搜索,而不是從包含預(yù)查的字符之后開(kāi)始。

          (?!pattern) 非獲取匹配,正向否定預(yù),在任何不匹配pattern的字符串開(kāi)始處匹配查找字符串,該匹配不需要獲取供以后使用。例如“Windows(?!95|98|NT|2000)”能匹配“Windows3.1”中的“Windows”,但不能匹配“Windows2000”中的“Windows”。

          (?<=pattern) 非獲取匹配,反向肯定預(yù)查,與正向肯定預(yù)查類似,只是方向相反。例如,“(?<=95|98|NT|2000)Windows”能匹配“2000Windows”中的“Windows”,但不能匹配“3.1Windows”中的“Windows”。

          (?<!patte_n) 非獲取匹配,反向否定預(yù)查,與正向否定預(yù)查類似,只是方向相反。例如“(?<!95|98|NT|2000)Windows”能匹配“3.1Windows”中的“Windows”,但不能匹配“2000Windows”中的“Windows”。

      三、C#代碼調(diào)用正則表達(dá)式

          命名空間 System.Text.RegularExpressions    1、new Regex(正則表達(dá)式).IsMatch(要匹配的字符串)   返回bool2、Regex.Match
              Match match = Regex.Match("age=30", @"^(.+)=(.+)$");if (match.Success)
              {
                  Console.WriteLine(match.Groups[0].Value);//第0組 輸出完整的字符串 age=30Console.WriteLine(match.Groups[1].Value);//第1組 ageConsole.WriteLine(match.Groups[2].Value);//第2組 30        }3、Regex.Matches
              StringBuilder sb = new StringBuilder();
              sb.Append("<Name>張三</Name>\r\n<Name>李四</Name>\r\n<Name>王五</Name>");
      
              MatchCollection mc = Regex.Matches(sb.ToString(), @"(?<=<Name>).*(?=</Name>)");foreach (Match m in mc)
              {
                  Console.WriteLine(m.Value);
              }

      四、示例說(shuō)明

      接下來(lái)針對(duì)第二大點(diǎn)的內(nèi)容我們舉些例子來(lái)說(shuō)明:

      示例1(普通字符):

      我們用 xyh 來(lái)匹配 xyh123 如下圖所示:

       從上面的正則表達(dá)式測(cè)試器匹配的結(jié)果可以看出:如果直接寫(xiě)多個(gè)普通字符,則會(huì)被當(dāng)做一個(gè)整體的字符串來(lái)匹配。

      示例2(元字符和限定符):

      我們用 \d 來(lái)匹配 xyh123 如下圖所示:

       從匹配的結(jié)果可以發(fā)現(xiàn)\d只是匹配單個(gè)數(shù)字,所以有三個(gè)結(jié)果,分別為1、2、3,那如果想匹配一整個(gè)字符串123要怎么辦呢?此時(shí)就要結(jié)合限定符來(lái)實(shí)現(xiàn)了。繼續(xù)來(lái)看下下面的一張圖。

       從圖中可以看出結(jié)合限定符后就可以實(shí)現(xiàn)匹配到123這個(gè)字符串了。

      示例3(普通字符和元字符組合):

      我們用 https://www\..+\.com 來(lái)匹配這么一句話:https://www.jd.com兩個(gè)鏈接https://www.taobao.com  如下圖所示:

       可以發(fā)現(xiàn)匹配的結(jié)果為完整的一整句話,那為什么不是匹配出2個(gè)結(jié)果分別為 https://www.jd.com 和 https://www.taobao.com 呢?

       那是因?yàn)槟J(rèn)情況下正則表達(dá)式采用貪婪模式匹配(即盡可能多匹配),所以匹配出了完整的一句話,此時(shí)可以用?來(lái)實(shí)現(xiàn)非貪婪模式匹配(即盡可能少匹配),如下圖所示:

       這樣就匹配出了2個(gè)結(jié)果

      示例4(分組):

       我們用 (abc)\1 來(lái)匹配 abcabc666 如下圖所示:

       從圖中可以看出匹配結(jié)果為abcabc,為什么會(huì)是這樣呢?首先我們分組(abc)匹配到存入緩存中的值為abc,通過(guò)\1的方式就取到了存入緩存中的第1個(gè)分組值abc,這個(gè)分組值abc與原來(lái)分組(abc)匹配到的字符串a(chǎn)bc組成新的匹配字符串a(chǎn)bcabc,用新的匹配字符串a(chǎn)bcabc去匹配abcabc666得到的匹配結(jié)果就是abcabc了。

      示例5(非獲取匹配):

      非獲取匹配(?:pattern)如下圖所示:

       從圖中可以看出非獲取匹配,匹配pattern但不獲取匹配結(jié)果,不進(jìn)行存儲(chǔ)供以后使用。因此無(wú)法通過(guò)“\數(shù)字”的方式來(lái)獲取。

      示例6(預(yù)查和零寬斷言):

      預(yù)查不消耗字符,它只是用于指定一個(gè)位置,如下圖所示:

       從圖中可以看出用 ab(?=a) 來(lái)匹配 ababa123 時(shí)會(huì)得到兩個(gè)結(jié)果而不是一個(gè)結(jié)果,那是因?yàn)轭A(yù)查不消耗字符(即不會(huì)消耗用來(lái)預(yù)查用的表達(dá)式exp對(duì)應(yīng)的字符),它只是用于指定一個(gè)位置,所以在第3個(gè)位置的a(即第2個(gè)a)沒(méi)有被消耗掉。當(dāng)匹配到第1個(gè)結(jié)果ab后會(huì)從第3個(gè)位置的a(即第2個(gè)a)開(kāi)始查找下一個(gè)能匹配的字符串,而不是從第4個(gè)位置的b(即第2個(gè)b)開(kāi)始查找,這就解釋了為什么會(huì)匹配到2個(gè)結(jié)果了。

      PS:本文僅是個(gè)人見(jiàn)解 ,如有表述錯(cuò)誤歡迎評(píng)論指正!

      正則表達(dá)式測(cè)試器:

      鏈接:https://pan.baidu.com/s/1CwyrLH2dwbBk1KVi2FCGDw 提取碼:nwyc

        本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買(mǎi)等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
        轉(zhuǎn)藏 分享 獻(xiàn)花(0

        0條評(píng)論

        發(fā)表

        請(qǐng)遵守用戶 評(píng)論公約

        類似文章 更多