国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 學(xué)院 > 開發(fā)設(shè)計(jì) > 正文

正則表達(dá)式入門教程(三)

2019-11-11 01:04:49
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

這篇是正則表達(dá)式的第三篇,我們接著第二篇的知識(shí)點(diǎn)開始講:

一:反義

有時(shí)需要查找不屬于某個(gè)能簡(jiǎn)單定義的字符類的字符。比如想查找除了數(shù)字以外,其它任意字符都行的情況,這時(shí)需要用到反義:

表中上面四個(gè)字母都是大寫:/W , /S , /D , /B

例子:/S+匹配不包含空白符的字符串。

<a[^>]+>匹配用尖括號(hào)括起來(lái)的以a開頭且以>結(jié)尾的字符串,a和>中間不能有>。

解析:<a> 表示以<和a開頭,以>結(jié)尾 ;[^>]+ 表示 a 和>中間不可以是>,且至少有一個(gè)或更多的字符

強(qiáng)化理解:

^的用法:

(1)

^表示表達(dá)式驗(yàn)證的開始,要驗(yàn)證的字符串完整的匹配^后面的內(nèi)容。比如: ^567     匹配“567”+str; $ 表示表達(dá)式驗(yàn)證的結(jié)束,要驗(yàn)證的字符串完整的匹配$前面的內(nèi)容。 比如 567$       匹配str+"567";^$結(jié)合起來(lái)   比如 ^567$              匹配 567;

(2)

 ^的另一種語(yǔ)意識(shí)非              比如 ^[^567]*$        匹配的字符串不包含5、6、7任意字符解釋: ^開始了一個(gè)字符串的匹配,[]表示定義需要匹配內(nèi)容的一個(gè)小節(jié)點(diǎn)的自定義,可以是很簡(jiǎn)單的[5],或者復(fù)雜點(diǎn)的[a-z]的小寫字母或者[a-zA-Z]的字母限定。這里的[^567]就表示你定義的這個(gè)節(jié)點(diǎn)的內(nèi)容不能是5、6、7中的任意一個(gè)。最后$表示字符串的匹配結(jié)束,你的字符串不能包括多余以^開頭以$結(jié)尾的內(nèi)容。

二:反向引用

使用小括號(hào)指定一個(gè)子表達(dá)式后,匹配這個(gè)子表達(dá)式的文本(也就是此分組捕獲的內(nèi)容)可以在表達(dá)式或其它程序中作進(jìn)一步的處理。默認(rèn)情況下,每個(gè)分組會(huì)自動(dòng)擁有一個(gè)組號(hào),規(guī)則是:從左向右,以分組的左括號(hào)為標(biāo)志,第一個(gè)出現(xiàn)的分組的組號(hào)為1,第二個(gè)為2,以此類推。

呃……其實(shí),組號(hào)分配還不像我剛說得那么簡(jiǎn)單:

分組0對(duì)應(yīng)整個(gè)正則表達(dá)式

實(shí)際上組號(hào)分配過程是要從左向右掃描兩遍的:第一遍只給未命名組分配,第二遍只給命名組分配--因此所有命名組的組號(hào)都大于未命名的組號(hào)

你可以使用(?:exp)這樣的語(yǔ)法來(lái)剝奪一個(gè)分組對(duì)組號(hào)分配的參與權(quán).

后向引用用于重復(fù)搜索前面某個(gè)分組匹配的文本。例如,/1代表分組1匹配的文本。難以理解?請(qǐng)看示例:

/b(/w+)/b/s+/1/b可以用來(lái)匹配重復(fù)的單詞,像go go, 或者kitty kitty。這個(gè)表達(dá)式首先是一個(gè)單詞,也就是單詞開始處和結(jié)束處之間的多于一個(gè)的字母或數(shù)字(/b(/w+)/b),這個(gè)單詞會(huì)被捕獲到編號(hào)為1的分組中,然后是1個(gè)或幾個(gè)空白符(/s+),最后是分組1中捕獲的內(nèi)容(也就是前面匹配的那個(gè)單詞)(/1)。

你也可以自己指定子表達(dá)式的組名。要指定一個(gè)子表達(dá)式的組名,請(qǐng)使用這樣的語(yǔ)法:(?<Word>/w+)(或者把尖括號(hào)換成'也行:(?'Word'/w+)),這樣就把/w+的組名指定為Word了。要反向引用這個(gè)分組捕獲的內(nèi)容,你可以使用/k<Word>,所以上一個(gè)例子也可以寫成這樣:/b(?<Word>/w+)/b/s+/k<Word>/b。

使用小括號(hào)的時(shí)候,還有很多特定用途的語(yǔ)法。下面列出了最常用的一些:

我們已經(jīng)討論了前兩種語(yǔ)法。第三個(gè)(?:exp)不會(huì)改變正則表達(dá)式的處理方式,只是這樣的組匹配的內(nèi)容不會(huì)像前兩種那樣被捕獲到某個(gè)組里面,也不會(huì)擁有組號(hào)。

反向引用這部分有點(diǎn)難,后面慢慢理解吧

三、零寬斷言

       表4中,接下來(lái)的四個(gè)用于查找在某些內(nèi)容(但并不包括這些內(nèi)容)之前或之后的東西,也就是說它們像/b,^,$那樣用于指定一個(gè)位置,這個(gè)位置應(yīng)該滿足一定的條件(即斷言),因此它們也被稱為零寬斷言。最好還是拿例子來(lái)說明吧:

斷言用來(lái)聲明一個(gè)應(yīng)該為真的事實(shí)。正則表達(dá)式中只有當(dāng)斷言為真時(shí)才會(huì)繼續(xù)進(jìn)行匹配。

       (?=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開頭的單詞的后半部分(除了re以外的部分),例如在查找reading a book時(shí),它匹配ading。

假如你想要給一個(gè)很長(zhǎng)的數(shù)字中每三位間加一個(gè)逗號(hào)(當(dāng)然是從右邊加起了),你可以這樣查找需要在前面和里面添加逗號(hào)的部分:((?<=/d)/d{3})+/b,用它對(duì)1234567890進(jìn)行查找時(shí)結(jié)果是234567890。

下面這個(gè)例子同時(shí)使用了這兩種斷言:(?<=/s)/d+(?=/s)匹配以空白符間隔的數(shù)字(再次強(qiáng)調(diào),不包括這些空白符)

四、負(fù)向零寬斷言

前面我們提到過怎么查找不是某個(gè)字符或不在某個(gè)字符類里的字符的方法(反義)。但是如果我們只是想要確保某個(gè)字符沒有出現(xiàn),但并不想去匹配它時(shí)怎么辦?例如,如果我們想查找這樣的單詞--它里面出現(xiàn)了字母q,但是q后面跟的不是字母u,我們可以嘗試這樣:

/b/w*q[^u]/w*/b匹配包含后面不是字母u的字母q的單詞

但是如果多做測(cè)試(或者你思維足夠敏銳,直接就觀察出來(lái)了),你會(huì)發(fā)現(xiàn),如果q出現(xiàn)在單詞的結(jié)尾的話,像Iraq,Benq,這個(gè)表達(dá)式就會(huì)出錯(cuò)。

這是因?yàn)閇^u]總要匹配一個(gè)字符,所以如果q是單詞的最后一個(gè)字符的話,后面的[^u]將會(huì)匹配q后面的單詞分隔符(可能是空格,或者是句號(hào)或其它的什么),后面的/w*/b將會(huì)匹配下一個(gè)單詞,于是/b/w*q[^u]/w*/b就能匹配整個(gè)Iraq fighting。

負(fù)向零寬斷言能解決這樣的問題,因?yàn)樗黄ヅ湟粋€(gè)位置,并不消費(fèi)任何字符。現(xiàn)在,我們可以這樣來(lái)解決這個(gè)問題:/b/w*q(?!u)/w*/b。

零寬度負(fù)預(yù)測(cè)先行斷言(?!exp),斷言此位置的后面不能匹配表達(dá)式exp。例如:/d{3}(?!/d)匹配三位數(shù)字,而且這三位數(shù)字的后面不能是數(shù)字;/b((?!abc)/w)+/b匹配不包含連續(xù)字符串a(chǎn)bc的單詞。

同理,我們可以用(?<!exp),零寬度負(fù)回顧后發(fā)斷言來(lái)斷言此位置的前面不能匹配表達(dá)式exp:(?<![a-z])/d{7}匹配前面不是小寫字母的七位數(shù)字。

一個(gè)更復(fù)雜的例子:(?<=<(/w+)>).*(?=<///1>)匹配不包含屬性的簡(jiǎn)單HTML標(biāo)簽內(nèi)里的內(nèi)容。(?<=<(/w+)>)指定了這樣的前綴:被尖括號(hào)括起來(lái)的單詞(比如可能是<b>),然后是.*(任意的字符串),最后是一個(gè)后綴(?=<///1>)。注意后綴里的//,它用到了前面提過的字符轉(zhuǎn)義;/1則是一個(gè)反向引用,引用的正是捕獲的第一組,前面的(/w+)匹配的內(nèi)容,這樣如果前綴實(shí)際上是<b>的話,后綴就是</b>了。整個(gè)表達(dá)式匹配的是<b>和</b>之間的內(nèi)容(再次提醒,不包括前綴和后綴本身)。

請(qǐng)?jiān)敿?xì)分析表達(dá)式(?<=<(/w+)>).*(?=<///1>),這個(gè)表達(dá)式最能表現(xiàn)零寬斷言的真正用途。

五、注釋

小括號(hào)的另一種用途是通過語(yǔ)法(?#comment)來(lái)包含注釋。例如:2[0-4]/d(?#200-249)|25[0-5](?#250-255)|[01]?/d/d?(?#0-199)。

要包含注釋的話,最好是啟用“忽略模式里的空白符”選項(xiàng),這樣在編寫表達(dá)式時(shí)能任意的添加空格,Tab,換行,而實(shí)際使用時(shí)這些都將被忽略。啟用這個(gè)選項(xiàng)后,在#后面到這一行結(jié)束的所有文本都將被當(dāng)成注釋忽略掉。例如,我們可以前面的一個(gè)表達(dá)式寫成這樣:

      (?<=    # 斷言要匹配的文本的前綴      <(/w+)> # 查找尖括號(hào)括起來(lái)的字母或數(shù)字(即HTML/xml標(biāo)簽)      )       # 前綴結(jié)束      .*      # 匹配任意文本      (?=     # 斷言要匹配的文本的后綴      <///1>  # 查找尖括號(hào)括起來(lái)的內(nèi)容:前面是一個(gè)"/",后面是先前捕獲的標(biāo)簽      )       # 后綴結(jié)束

參考博客:http://deerchao.net/tutorials/regex/regex.htm#mission


發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 安吉县| 岫岩| 镇康县| 石家庄市| 安平县| 儋州市| 瓦房店市| 礼泉县| 怀远县| 岚皋县| 博乐市| 象山县| 抚州市| 南汇区| 多伦县| 独山县| 洛川县| 大冶市| 富锦市| 永宁县| 通榆县| 巩留县| 柳林县| 远安县| 济源市| 东明县| 新和县| 石楼县| 乐东| 皮山县| 百色市| 云浮市| 鹤山市| 福州市| 娄烦县| 石首市| 新丰县| 江西省| 乌苏市| 衡阳市| 博罗县|