#content-region{background-image:url(http://p.blog.csdn.net/images/p_blog_csdn_net/rcom10002/EntryImages/20081027/watermark.gif);}#content-regionh3{border:1pxdotted#333333;background-color:#f9f9f9;padding:10px;font-size:24p" />

亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

簡單入門正則表達(dá)式 - 第四章 單字符的匹配

系統(tǒng) 2221 0
<style> #content-region { background-image: url(http://p.blog.csdn.net/images/p_blog_csdn_net/rcom10002/EntryImages/20081027/watermark.gif); } #content-region h3 { border: 1px dotted #333333; background-color: #f9f9f9; padding: 10px; font-size: 24px; } #content-region p { font-family: "宋體", "仿宋"; font-size: 16px; line-height: 28px; text-decoration: none; text-indent: 32px; } #content-region .regex-pattern { font-style: oblique; font-family: "Courier New", Courier, monospace; background-color: #FFCCCC; border-top-style: solid; border-right-style: none; border-bottom-style: solid; border-left-style: none; border-top-color: #FF0000; border-bottom-color: #FF0000; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-right-color: #FF0000; border-left-color: #FF0000; padding: 0px 5px 0px 5px; } #content-region .regex-result { font-family: "Courier New", Courier, monospace; background-color: #A4FFE1; border-top-style: solid; border-right-style: none; border-bottom-style: solid; border-left-style: none; border-top-color: #339966; border-bottom-color: #339966; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-right-color: #339966; border-left-color: #339966; padding: 0px 5px 0px 5px; } #content-region blockquote { padding: 10px; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: dotted; border-right-style: dotted; border-bottom-style: dotted; border-left-style: dotted; width: auto; } #content-region img { border: 1px dotted #000000; padding: 16px; background-color: #f9f9f9; margin-top: 16px; margin-right: 16px; margin-bottom: 16px; margin-left: 64px; } #content-region code { white-space: pre; } </style>

一、單一字符的匹配

正則表達(dá)式中,最簡單的匹配就是單字符匹配了,這就像我們利用文本工具在文檔中查找一個(gè)字符一樣簡單。下面我們使用 EmEditor 來做個(gè)小實(shí)驗(yàn),在字符串“Regular Expression”中查找字符“e”。

簡單入門正則表達(dá)式 - 第四章 單字符的匹配

Ctrl+F 打開查找對話框,然后在“查找”框內(nèi)鍵入字符“s”,并選用“匹配大小寫”和“使用正則表達(dá)式”模式,然后進(jìn)行查找操作。從上圖的效果來看,同時(shí)有兩個(gè)“s”被匹配到了,但實(shí)際上這是執(zhí)行了兩次匹配操作的結(jié)果,每次操作只匹配了一個(gè)字符“s”,操作順序是自左向右。讓我們再嘗試使用 Expresso 就能看出其中的奧秘,如下圖所示:

簡單入門正則表達(dá)式 - 第四章 單字符的匹配

在“Regular Expression”的選項(xiàng)卡下輸入“s”,“Sample Input Data”區(qū)域中輸入字符串“Regular Expression”,在單擊“Run Match”按鈕就能看到匹配結(jié)果。在上圖的右下角出現(xiàn)了兩個(gè)“s”,這是發(fā)生了兩次匹配操作,每次都有一個(gè)結(jié)果的緣故。

二、任意字符的匹配

當(dāng)我們使用計(jì)算機(jī)時(shí),經(jīng)常需要打開和保存文件,這就免不了要與打開/保存對話框打交道,其中涉及到的文件類型都采用 * 點(diǎn)擴(kuò)展名這種形式。比如說 HTML 文件,它所對應(yīng)的文件類型就是 *.html 或 *.htm,星號就是一個(gè)通配符,表示與任意字符匹配,而在正則表達(dá)式中,也有這么一個(gè)通配符“.”,它可以與任意單字符相匹配,但通常不包括換行符。

接著上面的例子,我們把正則表達(dá)式樣式修改為 p.e.s ,這時(shí)的通配符“.”就分別與目標(biāo)字符串的“r”和“s”相匹配,結(jié)果為“Regular Ex press ion”。

簡單入門正則表達(dá)式 - 第四章 單字符的匹配

三、匹配可選字符

在匹配目標(biāo)字符串時(shí),有時(shí)候可能會有些特殊需求,比方說我們要對詞組“Regular Expression”或者“Regular Expressions”進(jìn)行匹配,無論哪種形式的詞組,我們都想能夠成功匹配。這時(shí),單詞“Expression”后面的“s”就是可選的,在正則表達(dá)式中,問號表示它所指定的樣式出現(xiàn)的次數(shù)為零次或一次,所以,我們可以編寫正則表達(dá)式 Regular Expressions? 來進(jìn)行匹配。

簡單入門正則表達(dá)式 - 第四章 單字符的匹配

四、特殊字符的處理

到目前為止,常規(guī)字符我們都可以成功地進(jìn)行匹配,但是,還有一種情況就是像問號這樣在正則表達(dá)式中含有特殊意義的字符,對于這些字符來說,我們是無法直接利用它們進(jìn)行匹配操作,那該如何對這些符進(jìn)行轉(zhuǎn)義呢?跟許多程序語言一樣,正則表達(dá)式也提供了一個(gè)轉(zhuǎn)義的處理機(jī)制,我們可以使用轉(zhuǎn)義操作符反斜桿“/”。所以,如果我們想匹配問號和點(diǎn),使用“/?”和“/.”就可以。同樣,對于轉(zhuǎn)義符“/”來說,它對自身也可以實(shí)現(xiàn)轉(zhuǎn)義功能,連續(xù)的兩個(gè)“/”代表了一個(gè)字符“/”。

修改上面的正則表達(dá)式為 Regular Expression/? ,它就能與字符串“Regular Expression?”相匹配了。在編寫正則表達(dá)式時(shí),如果碰到了要匹配特殊字符的情況,那就一定要使用轉(zhuǎn)義操作。

簡單入門正則表達(dá)式 - 第四章 單字符的匹配

五、“*”與“+”

同“?”和“.”一樣,“*”和“+”也是具有特殊含義的字符,它們的作用是讓某個(gè)指定了的正則表達(dá)式樣式進(jìn)行多次重復(fù)匹配。“*”的重復(fù)次數(shù)是從零開始的,規(guī)定其前導(dǎo)內(nèi)容必須在目標(biāo)字符串中出現(xiàn)零次或更多次;而“+”所對應(yīng)的重復(fù)次數(shù)是從一開始的,規(guī)定其前導(dǎo)內(nèi)容必須在目標(biāo)字符串中出現(xiàn)一次或更多次。它們的重復(fù)次數(shù)都沒有上限值限制,也就是說它們的前導(dǎo)內(nèi)容可以在目標(biāo)字符串中不斷地重復(fù)出現(xiàn)。

正則表達(dá)式 ABC9* 表示一個(gè)以“ABC”開頭,后面為零個(gè)或多個(gè)連續(xù)“9”的字符串。這樣,它就能與字符串“ABC”、“ABC9”、“ABC99”和“ABC999”等內(nèi)容相匹配了。

我們先來分析一下對字符串“ABC”的匹配,當(dāng)正則表達(dá)式引擎對 ABC 匹配結(jié)束后,下一個(gè)參與匹配的字符就應(yīng)該是“9”,但根據(jù)“*”的零次匹配原則,“9”是可以不出現(xiàn)的,所以,字符串“ABC”就成功地被匹配了。

再來看一下字符串“ABC999”,對字符“C”的匹配結(jié)束后,碰到的下一個(gè)字符就是“9”,成功匹配之后,繼續(xù)下一個(gè)字符,一直到最后一個(gè)字符為止,字符“9”出現(xiàn)的次數(shù)與“*”的多次匹配原則保持一致,所以字符串“ABC999”也能夠被成功匹配。

簡單入門正則表達(dá)式 - 第四章 單字符的匹配

六、花括號的使用

上面介紹了如何讓我們的匹配內(nèi)容進(jìn)行無限次的循環(huán)匹配,現(xiàn)在,我們學(xué)習(xí)一下怎么樣精確地控制循環(huán)匹配次數(shù)。正則表達(dá)式提供了一種使用花括號的方法控制循環(huán)匹配次數(shù),語法形式有{n}、{n,}、{m,n}三種,其中 m 和 n 都是非負(fù)整數(shù),且 m 的值小于 n值。

{n} 代表了被指定的匹配樣式必須在目標(biāo)對象中重復(fù)出現(xiàn) n 次;{n,}表示被指定的匹配樣式在目標(biāo)對象中至少要重復(fù)出現(xiàn) n 次,但無上限值限制;{m,n}指定了循環(huán)次數(shù)的范圍,至少要重復(fù)出現(xiàn) m 次,至多重復(fù)出現(xiàn) n 次,如果 m 值比 n 大,{m, n}的作用就相當(dāng)于{m, m}。

現(xiàn)在,我們思考一個(gè)問題,“*”和“+”同樣能夠?qū)χ貜?fù)匹配的次數(shù)做出限定,那么,如何用花括號形式表示呢?由于“*”表示指定的匹配樣式要重復(fù)出現(xiàn) 0 或多次,所以,我們可以先用{0}滿足重復(fù)出現(xiàn) 0 次的要求。但是如又何滿能夠足重復(fù)多次的要求呢,由于最終重復(fù)出現(xiàn)的次數(shù)是不固定的,我們就不能采用{m,n}這種形式,現(xiàn)在也只有采用最后一種形式{n,},“*”對應(yīng)的花括號表現(xiàn)形式為{0,}。同理可推“+”對應(yīng)的花括號表現(xiàn)形式為{1,},相對于用于可選匹配的“?”來說,用{0,1}來替換即可。

七、貪婪模式與懶惰模式

當(dāng)我們使用含有次數(shù)限制的匹配語法時(shí),常常會碰到正則表達(dá)式中的貪婪式與懶惰式的概念。那它們到底是什么意思呢?先看一下下面兩種對HTML標(biāo)記進(jìn)行匹配的例子,構(gòu)造正則表達(dá)式 <.+> 來匹配字符串“<a>W3C A to Z</a>”,如下圖所示:

簡單入門正則表達(dá)式 - 第四章 單字符的匹配

為什么 <.+> 并沒有像我們預(yù)想的那樣匹配每一個(gè)HTML標(biāo)記,而是一次性“吃掉”了所有的內(nèi)容呢?這就是貪婪的匹配模式!讓我們分析一下正則表達(dá)式引擎的匹配機(jī)制,就會明白其中的道理了。首先要匹配的字符是“<”(匹配過程01),這個(gè)一點(diǎn)問題也沒有,然后輪到通配符“.”上場了,因?yàn)樗竺婢o跟著一個(gè)“+”,這就能讓它毫無顧忌的一個(gè)勁兒匹配下去,當(dāng)匹配到字符串“<a>W3C A to Z</a>”最后一個(gè)字符“>”時(shí),引擎發(fā)現(xiàn)無法找到相匹配的字符串,就嘗試著回退,把最后一次機(jī)會讓給“>”。結(jié)果當(dāng)然是匹滿足條件的了,這就是為什么匹配結(jié)果是整個(gè)目標(biāo)字符串而不是“<a>”和“</a>”。

匹配過程01 => <
匹配過程02 => <a>W3C A to Z</a>
匹配過程03 => <a>W3C A to Z</a>backtrack
匹配過程04 => <a>W3C A to Z</a
匹配過程05 => <a>W3C A to Z</a>
匹配過程06 => Match found

接下來,我們再分析一下采用懶惰模式的正則表達(dá)式 <.+?> ,貪婪模式與懶惰模式的語法區(qū)別在于重復(fù)限定修飾符的后面是否有問號,有的話就是懶惰模式,否則就是貪婪模式。

簡單入門正則表達(dá)式 - 第四章 單字符的匹配

懶惰模式下匹配的結(jié)果有兩個(gè),“<a>”和“</a>”。對于前者的匹配過程是,首先匹配首字符“<”;然后再將“.”與“a”相匹配,這時(shí)“.”已經(jīng)滿足了“+”的匹配次數(shù)至少要達(dá)到一次的要求,由于懶惰模式的緣故,“+”只要能滿足匹配條件就不會繼續(xù)執(zhí)行下去;接下來要參與匹配的字符就是“>”,這時(shí)恰好滿足整個(gè)正則表達(dá)式的要求。對于后者來說要稍微復(fù)雜一點(diǎn),當(dāng)?shù)诙健?”與“/”匹配后,第三步就要直接用“>”進(jìn)行匹配,但“>”并不能與“a”相匹配,所以只能放棄,繼續(xù)由“.”再次擔(dān)任匹配任務(wù);與“a”匹配完畢后,重新嘗試用“>”進(jìn)行匹配操作,這次匹配成功并且目標(biāo)字符串再沒有可以參與匹配操作的字符串,整個(gè)匹配過程順利結(jié)束,結(jié)果就是“</a>”。

<
<a
<a>
Match found
<
</
</backtrack
</a
</a>
Match found

不光是“*”和“+”有貪婪與懶惰兩種模式,花括號語法同樣存在相同的情況。如果用正則表達(dá)式 (as){3, 4} 來匹配字符串“asasasasas”,結(jié)果就是“ asasasas as”,有四組“as”被匹配;要是換成 (as){3,4}? ,結(jié)果就是“ asasas asas”,有三組“as”被匹配。

<!-- InstanceEndEditable -->

簡單入門正則表達(dá)式 - 第四章 單字符的匹配


更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯(lián)系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長非常感激您!手機(jī)微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發(fā)表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 级毛片 | 97影院秋霞国产精品 | 国产免费一级高清淫日本片 | 日韩在线无| 国产成人精品自拍 | 99国产大尺度福利视频 | 日韩欧美理论片 | 久久这里只有精品国产99 | 嫩草成人国产精品 | 久久精品久 | 一区二区三区精品视频 | 福利在线不卡 | 国产亚洲精品资源一区 | 青青青激情视频在线最新 | 亚洲午夜视频 | 国产香蕉尹人综合在线 | 91视频国产91久久久 | 九九免费精品视频在这里 | 国产在线精品福利91香蕉 | 中文xxx视频 | 天天拍拍夜夜出水 | 中文字幕在线二区 | 国产三级精品三级男人的天堂 | 一区二区视频免费看 | 一级毛片视频在线观看 | 成人国产在线看不卡 | 偷亚洲偷国产欧美高清 | 亚洲精品久久久久久小说 | 国产伦精品一区二区三区免费观看 | 91aaa免费观看在线观看资源 | 免费看成人毛片日本久久 | 国产美女流白浆的免费视 | 中文字幕精品一区二区精品 | 国产一区二区三区在线免费观看 | 一区二区在线播放福利视频 | 九九热视频在线 | 97在线视频观看 | 免费国产一区二区在免费观看 | 午夜色影院| 国产在线视频精品视频免费看 | 女人洗澡一级毛片一级毛片 |