亚洲国产一区二区三区精品,亚洲国产精品国自产拍AV,日本免费不卡v,国产精品亚洲第一页

<sub id="61a2t"><input id="61a2t"><em id="61a2t"></em></input></sub>

    1. <legend id="61a2t"></legend>
    2. 正則表達(dá)式入門學(xué)習(xí)資料

      時(shí)間:2022-10-06 02:08:47 學(xué)習(xí)資料 投訴 投稿
      • 相關(guān)推薦

      正則表達(dá)式入門學(xué)習(xí)資料

        1 概述

      正則表達(dá)式入門學(xué)習(xí)資料

        正則表達(dá)式(Regular Expression)是一種匹配模式,描述的是一串文本的特征。

        正如自然語(yǔ)言中“高大”、“堅(jiān)固”等詞語(yǔ)抽象出來(lái)描述事物特征一樣,正則表達(dá)式就是字符的高度抽象,用來(lái)描述字符串的特征。

        正則表達(dá)式(以下簡(jiǎn)稱正則,Regex)通常不獨(dú)立存在,各種編程語(yǔ)言和工具作為宿主語(yǔ)言提供對(duì)正則的支持,并根據(jù)自身語(yǔ)言的特點(diǎn),進(jìn)行一定的剪裁或擴(kuò)展。

        正則入門很容易,有限的語(yǔ)法規(guī)則很容易掌握,但是目前正則的普及率并不高,主要是因?yàn)檎齽t的流派眾多,各種宿主語(yǔ)言提供的文檔都過(guò)多的關(guān)注于自身的一些細(xì)節(jié),而這些細(xì)節(jié)通常是初學(xué)者并不需要關(guān)注的。

        當(dāng)然,如果想要深入的了解正則表達(dá)式,這些細(xì)節(jié)又是必須被關(guān)注的,這是后話,讓我們先從正則的基礎(chǔ)開始,進(jìn)入正則表達(dá)式的世界。

        2 正則表達(dá)式基礎(chǔ)

        2.1 基本概念

        2.1.1 字符串組成

        對(duì)于字符串“a5”,是由兩個(gè)字符“a”、“5”以及三個(gè)位置組成的,這一點(diǎn)對(duì)于正則表達(dá)式的匹配原理理解很重要。

        2.1.2 占有字符和零寬度

        正則表達(dá)式匹配過(guò)程中,如果子表達(dá)式匹配到的是字符內(nèi)容,而非位置,并被保存到最終的匹配結(jié)果中,那么就認(rèn)為這個(gè)子表達(dá)式是占有字符的;如果子表達(dá)式匹配的僅僅是位置,或者匹配的內(nèi)容并不保存到最終的匹配結(jié)果中,那么就認(rèn)為這個(gè)子表達(dá)式是零寬度的。

        占有字符還是零寬度,是針對(duì)匹配的內(nèi)容是否保存到最終的匹配結(jié)果中而言的。

        占有字符是互斥的,零寬度是非互斥的。也就是一個(gè)字符,同一時(shí)間只能由一個(gè)子表達(dá)式匹配,而一個(gè)位置,卻可以同時(shí)由多個(gè)零寬度的子表達(dá)式匹配。

        2.1.3 正則表達(dá)式構(gòu)成

        正則表達(dá)式由兩種字符構(gòu)成。一種是在正則表達(dá)式中具體特殊意義的“元字符”,另一種是普通的“文本字符”。

        元字符可以是一個(gè)字符,如“^”,也可以是一個(gè)字符序列,如“w”。

        2.2 元字符(Meta Character)2.2.1 […] 字符組(Character Classes)

        字符組可以匹配[ ]中包含的任意一個(gè)字符。雖然可以是任意一個(gè),但只能是一個(gè)。

        字符組支持由連字符“-”來(lái)表示一個(gè)范圍。當(dāng)“-”前后構(gòu)成范圍時(shí),要求前面字符的碼位小于后面字符的碼位。

        [^…] 排除型字符組。排除型字符組表示任意一個(gè)未列出的字符,同樣只能是一個(gè)。排除型字符組同樣支持由連字符“-”來(lái)表示一個(gè)范圍。

        表達(dá)式

        說(shuō)明

        [abc]

        表示“a”或“b”或“c”

        [0-9]

        表示0~9中任意一個(gè)數(shù)字,等價(jià)于[0123456789]

        [u4e00-u9fa5]

        表示任意一個(gè)漢字

        [^a1<]

        表示除“a”、“1”、“<”外的其它任意一個(gè)字符

        [^a-z]

        表示除小寫字母外的任意一個(gè)字符

        舉例:

        “[0-9][0-9]”在匹配“Windows 2003”時(shí),匹配成功,匹配的結(jié)果為“20”。

        “[^inW]”在匹配“Windows 2003”時(shí),匹配成功,匹配的結(jié)果為“d”。

        2.2.2 常見字符范圍縮寫

        對(duì)于一些常用的字符范圍,如數(shù)字等,由于非常常用,即使使用[0-9]這樣的字符組仍顯得麻煩,所以定義了一些元字符,來(lái)表示常見的字符范圍。

        表達(dá)式

        說(shuō)明

        d

        任意一個(gè)數(shù)字,相當(dāng)于[0-9],即0~9 中的任意一個(gè)

        w

        任意一個(gè)字母或數(shù)字或下劃線,相當(dāng)于[a-zA-Z0-9_]

        s

        任意空白字符,相當(dāng)于[ rnftv]

        D

        任意一個(gè)非數(shù)字字符,d取反,相當(dāng)于[^0-9]

        W

        w取反,相當(dāng)于[^a-zA-Z0-9_]

        S

        任意非空白字符,s取反,相當(dāng)于[^ rnftv]

        舉例:

        “wsd”在匹配“Windows 2003”時(shí),匹配成功,匹配的結(jié)果為“s 2”。

        2.2.3 . 小數(shù)點(diǎn)

        小數(shù)點(diǎn)可以匹配除“n”以外的任意一個(gè)字符。如果要匹配包括“n”在內(nèi)的所有字符,一般用[sS],或者是用“.”加(?s)匹配模式來(lái)實(shí)現(xiàn)。

        表達(dá)式

        說(shuō)明

        匹配除了換行符 n 以外的任意一個(gè)字符

        2.2.4 其它元字符

        表達(dá)式

        說(shuō)明

        ^

        匹配字符串開始的位置,不匹配任何字符

        $

        匹配字符串結(jié)束的位置,不匹配任何字符

        b

        匹配單詞邊界,不匹配任何字符

        舉例:

        “^a”在匹配“cba”時(shí),匹配失敗,因?yàn)楸磉_(dá)式要求開始位置后面是字符“a”,而“cba”顯然是不滿足的。

        “d$”在匹配“123”時(shí),匹配成功,匹配結(jié)果為“3”,這個(gè)表達(dá)式要求匹配結(jié)尾處的數(shù)字,如果結(jié)尾處不是數(shù)字,如“123abc”,則是匹配失敗的。

        2.2.5 轉(zhuǎn)義字符

        一些不可見字符,或是在正則中具有特殊意義的元字符,如想匹配字符本身,需要用“”對(duì)其進(jìn)行轉(zhuǎn)義。

        表達(dá)式

        說(shuō)明

        r,n

        回車和換行

        匹配“”本身

        ^,$,.

        分別匹配“^”、“$”和“.”

        以下字符在匹配其本身時(shí),通常需要進(jìn)行轉(zhuǎn)義。在實(shí)際應(yīng)用中,根據(jù)具體情況,需要轉(zhuǎn)義的字符可能不止如下所列字符

        . $ ^ { [ ( | ) * + ?

        2.2.6 量詞(Quantifier)

        量詞表示一個(gè)子表達(dá)式可以匹配的次數(shù)。量詞可以用來(lái)修飾一個(gè)字符、字符組,或是用()括起來(lái)的子表達(dá)式。一些常用的量詞被定義成獨(dú)立的元字符。

        表達(dá)式

        說(shuō)明

        舉例

        {m}

        表達(dá)式匹配m次

        “d{3}”相當(dāng)于“ddd ”

        “(abc){2}”相當(dāng)于“abcabc”

        {m,n}

        表達(dá)式匹配最少m次,最多n次

        “d{2,3}”可以匹配“12”或“321”等2到3位的數(shù)字

        {m,}

        表達(dá)式至少匹配m次

        “[a-z]{8,}”表示至少8位以上的字母

        ?

        表達(dá)式匹配0次或1次,相當(dāng)于{0,1}

        “ab?”可以匹配“a”或“ab”

        *

        表達(dá)式匹配0次或任意多次,相當(dāng)于{0,}

        “<[^>]*>”中“[^>]*”表示0個(gè)或任意多個(gè)不是“>”的字符

        +

        表達(dá)式匹配1次或意多次,至少1次,相當(dāng)于{1,}

        “ds+d”表示兩個(gè)數(shù)字中間,至少有一個(gè)以上的空白字符

        注意:在不是動(dòng)態(tài)生成的正則表達(dá)式中,不要出現(xiàn)“{1}”這樣的量詞,如“w{1}”在結(jié)果上等價(jià)于“w”,但是會(huì)降低匹配效率和可讀性,屬于畫蛇添足的做法。

        2.2.7 分支結(jié)構(gòu)(Alternation)

        當(dāng)一個(gè)字符串的某一子串具有多種可能時(shí),采用分支結(jié)構(gòu)來(lái)匹配,“|”表示多個(gè)子表達(dá)式之間“或”的關(guān)系,“|”是以()限定范圍的,如果在“|”的左右兩側(cè)沒有()來(lái)限定范圍,那么它的作用范圍即為“|”左右兩側(cè)整體。

        表達(dá)式

        說(shuō)明

        |

        多個(gè)子表達(dá)式之間取“或”的關(guān)系

        舉例:

        “^aa|b$”在匹配“cccb”時(shí),是可以匹配成功的,匹配的結(jié)果是“b”,因?yàn)檫@個(gè)表達(dá)式表示匹配“^aa”或“b$”,而“b$”在匹配“cccb ”時(shí)是可以匹配成功的。

        “^(aa|b)$”在區(qū)配“cccb”時(shí),是匹配失敗的,因?yàn)檫@個(gè)表達(dá)式表示在“開始”和“結(jié)束”位置之間只能是“aa”或“b”,而“cccb”顯然是不滿足的。

        3 正則表達(dá)式進(jìn)階

        3.1 捕獲組(Capture Group)

        捕獲組就是把正則表達(dá)式中子表達(dá)式匹配的內(nèi)容,保存到內(nèi)存中以數(shù)字編號(hào)或手動(dòng)命名的組里,以供后面引用。

        表達(dá)式

        說(shuō)明

        (Expression)

        普通捕獲組,將子表達(dá)式Expression匹配的內(nèi)容保存到以數(shù)字編號(hào)的組里

        (?Expression)

        命名捕獲組,將子表達(dá)式Expression匹配的內(nèi)容保存到以name命名的組里

        普通捕獲組(在不產(chǎn)生歧義的情況下,簡(jiǎn)稱捕獲組)是以數(shù)字進(jìn)行編號(hào)的,編號(hào)規(guī)則是以“(”從左到右出現(xiàn)的順序,從1開始進(jìn)行編號(hào)。通常情況下,編號(hào)為0的組表示整個(gè)表達(dá)式匹配的內(nèi)容。

        命名捕獲組可以通過(guò)捕獲組名,而不是序號(hào)對(duì)捕獲內(nèi)容進(jìn)行引用,提供了更便捷的引用方式,不用關(guān)注捕獲組的序號(hào),也不用擔(dān)心表達(dá)式部分變更會(huì)導(dǎo)致引用錯(cuò)誤的捕獲組。

        3.2 非捕獲組

        一些表達(dá)式中,不得不使用( ),但又不需要保存( )中子表達(dá)式匹配的內(nèi)容,這時(shí)可以用非捕獲組來(lái)抵消使用( )帶來(lái)的副作用。

        表達(dá)式

        說(shuō)明

        (?:Expression)

        進(jìn)行子表達(dá)式Expression的匹配,并將匹配內(nèi)容保存到最終的整個(gè)表達(dá)式的區(qū)配結(jié)果中,但Expression匹配的內(nèi)容不單獨(dú)保存到一個(gè)組內(nèi)

        3.3 反向引用

        捕獲組匹配的內(nèi)容,可以在正則表達(dá)式的外部程序中進(jìn)行引用,也可以在表達(dá)式中進(jìn)行引用,表達(dá)式中引用的方式就是反向引用。

        反向引用通常用來(lái)查找重復(fù)的子串,或是限定某一子串成對(duì)出現(xiàn)。

        表達(dá)式

        說(shuō)明

        1,2

        對(duì)序號(hào)為1和2的捕獲組的反向引用

        k

        對(duì)命名為name的捕獲組的反向引用

        舉例:

        “(a|b)1”在匹配“abaa”時(shí),匹配成功,匹配到的結(jié)果是“aa”!(a|b)”在嘗試匹配時(shí),雖然既可以匹配“a”,也可以匹配“b”,但是在進(jìn)行反向引用時(shí),對(duì)應(yīng)()中匹配的內(nèi)容已經(jīng)是固定的了。

        3.4 環(huán)視(Look Around)

        環(huán)視只進(jìn)行子表達(dá)式的匹配,匹配內(nèi)容不計(jì)入最終的匹配結(jié)果,是零寬度的。

        環(huán)視按照方向劃分有順序和逆序兩種,按照是否匹配有肯定和否定兩種,組合起來(lái)就有四種環(huán)視。環(huán)視相當(dāng)于對(duì)所在位置加了一個(gè)附加條件。

        表達(dá)式

        說(shuō)明

        (?<=Expression)

        逆序肯定環(huán)視,表示所在位置左側(cè)能夠匹配Expression

        (?<!Expression)

        逆序否定環(huán)視,表示所在位置左側(cè)不能匹配Expression

        (?=Expression)

        順序肯定環(huán)視,表示所在位置右側(cè)能夠匹配Expression

        (?!Expression)

        順序否定環(huán)視,表示所在位置右側(cè)不能匹配Expression

        舉例:

        “(?<=Windows )d+”在匹配“Windows 2003”時(shí),匹配成功,匹配結(jié)果為“2003”。我們知道“d+”表示匹配一個(gè)以上的數(shù)字,而“(?<=Windows )”相當(dāng)于一個(gè)附加條件,表示所在位置左側(cè)必須為“Windows ”,它所匹配的內(nèi)容并不計(jì)入匹配結(jié)果。同樣的正則在匹配“Office 2003”時(shí),匹配失敗,因?yàn)檫@里任意一串?dāng)?shù)字子串的左側(cè)都不是“Windows ”。

        “(?!1)d+”在匹配“123”時(shí),匹配成功,匹配的結(jié)果為“23”!癲+”匹配一個(gè)以上數(shù)字,但是附加條件“(?!1)”要求所在位置右側(cè)不能是“1”,所以匹配成功的位置是“2”前面的位置。

        3.5 忽略優(yōu)先和匹配優(yōu)先

        或者叫做正則表達(dá)式匹配的貪婪與非貪婪模式。

        標(biāo)準(zhǔn)量詞修飾的子表達(dá)式,在可匹配可不匹配的情況下,總會(huì)先嘗試進(jìn)行匹配,稱這種方式為匹配優(yōu)先,或者貪婪模式。此前介紹的一些量詞,“{m}”、“{m,n}”、“{m,}”、“?”、“*”和“+”都是匹配優(yōu)先的。

        一些NFA正則引擎支持忽略優(yōu)先量詞,也就是在標(biāo)準(zhǔn)量詞后加一個(gè)“?”,此時(shí),在可匹配可不匹配的情況下,總會(huì)先忽略匹配,只有在由忽略優(yōu)先量詞修飾的子表達(dá)式,必須進(jìn)行匹配才能使整個(gè)表達(dá)式匹配成功時(shí),才會(huì)進(jìn)行匹配,稱這種方式為忽略優(yōu)先,或者非貪婪模式。忽略優(yōu)先量詞包括“{m}?”、“{m,n}?”、“{m,}?”、“??”、“*?”和“+?”。

        舉例:

        源字符串:

        aaa

        bbb

        正則表達(dá)式1:

        .*

        匹配結(jié)果:

        aaa

        bbb

        正則表達(dá)式2:

        .*?

        匹配結(jié)果:

        aaa

      【正則表達(dá)式入門學(xué)習(xí)資料】相關(guān)文章:

      語(yǔ)文的學(xué)習(xí)資料10-13

      《絕句》學(xué)習(xí)資料10-14

      《詠雪》學(xué)習(xí)資料10-10

      《春》學(xué)習(xí)資料02-07

      寒衣節(jié)的學(xué)習(xí)資料10-17

      《秋天的懷念》學(xué)習(xí)資料10-11

      高考學(xué)習(xí)資料11-01

      《濟(jì)南的冬天》學(xué)習(xí)資料02-04

      《秋天的懷念》學(xué)習(xí)資料02-05

      有關(guān)學(xué)習(xí)資料的介紹06-28