欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Further Study of Rugular Expresions

 更新時(shí)間:2008年09月24日 22:53:38   作者:  
regular expressions(正則表達(dá)式,以下用re稱呼)對(duì)小弟來說一直都是神密的地帶,看到一些網(wǎng)絡(luò)上的大大,簡(jiǎn)單用re就決解了 某些文字的問題

  17. (\(\d{3}\)\d{3})\s?\d{3}[- ]\d{4} (十個(gè)數(shù)字的電話號(hào)碼)
  群組(grouping)
  括號(hào)可以用來介定一個(gè)次描述,經(jīng)由次描述的介定,可以針對(duì)次描述做重復(fù)或及他的處理。
  18. (\d{1,3}\.){3}\d{1,3} (尋找網(wǎng)絡(luò)地址的簡(jiǎn)單re)
  此re的意思第一個(gè)部分(\d{1,3}\.){3},所指的是,數(shù)字最小一位最多三位,并且后面接有”.”符號(hào),此類型的共有三個(gè),之后再接一到三位的數(shù)字,也就是如192.72.28.1這樣的數(shù)字。
  但這樣會(huì)有個(gè)缺點(diǎn),因?yàn)榫W(wǎng)絡(luò)地址數(shù)字最多只到255,但上述的re只要是一到三位的數(shù)字都是符合的,所以這需要讓比較的數(shù)字小于256才行,但只單獨(dú)使用re并無法做這樣的比較。在19中使用擇一來將地址的限制在所需要的范圍內(nèi),也就是0到255。
  19. ((2[0-4]\d25[0-5][01]?\d\d?)\.){3}(2[0-4]\d25[0-5][01]?\d\d?) (尋找網(wǎng)絡(luò)地址)
  有沒有發(fā)覺re越來越像外星人說的話了?就以簡(jiǎn)單的尋找網(wǎng)絡(luò)地址,直接看re都滿難理解的哩。
  expresso analyzer view
  expresso提供了一個(gè)功能,它可以將所下的re變成樹狀的說明,一組組的分開說明,提供了一個(gè)好的除錯(cuò)環(huán)境。其它的功能,如部分符合 (partial match只查找反白re的部分)及除外符合(exclude match只不查找反白re的部分)就留給各位大大試試啰。
  當(dāng)次描述用括號(hào)群組起來時(shí),符合次描述的文字可用在之后的程序處理或re本身。在預(yù)設(shè)的情型下,所符合的群組是由數(shù)字命名,由1開始,由順序是由左至右,這自動(dòng)群組命名,可在expresso中的skeleton view或result view中看到。
  backreference是用來查找群組中抓取的符合文字所相同的文字。舉例來說”\1”所指符合群組1所抓取的文字。
  20. \b(\w+)\b\s*\1\b (尋找重復(fù)字,此處說的重復(fù)是指同樣的字,中間有空白隔開如dog dog這樣的字)
(\w+)會(huì)抓取至少一個(gè)字符的字母或數(shù)字的字,并將它命名為群組1,之后是查找任意空格符,再接和群組1相同的文字。
  如果不喜歡群組自動(dòng)命名的1,也可以自行命名,以上述例子為例,(\w+)改寫為(?<word>\w+),這就是將所抓取的群組命名為word,backreference就要改寫成為\k<word>
21. \b(?<word>\w+)\b\s*\k<word>\b (使用自行命名群組抓取重復(fù)字)
  使用括號(hào)還有許多特別的語法元素,比較通用的列表如下:
  抓取(captures)
  (exp) 符合exp并抓取它進(jìn)自動(dòng)命名的群組
  (?<name>exp) 符合exp并抓取它進(jìn)命名的群組name
  (?:exp) 符合exp,不抓取它
  lookarounds
  (?=exp) 符合字尾為exp的文字
  (?<=exp) 符合前綴為exp的文字
  (?!exp) 符合后面沒接exp字尾的文字
  (?<!exp) 符合前面沒接exp前綴的文字
  批注comment
  (?#comment) 批注
  positive lookaround
  接下來要談的是lookahead及l(fā)ookbehind assertions。它們所查找的是目前符合之前或之后的文字,并不包含目前符合本身。 這些就如同”^”及”\b”特殊字符,本身并不會(huì)對(duì)應(yīng)任何文字(用來界定位置),也因此稱做是zero-width assertions,看些例子也許 會(huì)清楚些。
  (?=exp)是一個(gè)”zero-width positive lookahead assertion”。它指的就是符合字尾為exp的文字,但不包含exp本身。
  22. \b\w+(?=ing\b) (字尾為ing的字,比如說filling所符合的就是fill)
(?<=exp)是一個(gè)”zero-width positive lookbehind assertion”。它指的就是符合前綴為exp的文字,但不包含exp本身。
  23. (?<=\bre)\w+\b (前綴為re的字,比如說repeated所符合的就是peated)
  24. (?<=\d)\d{3}\b (在字尾的三位數(shù)字,且之前接一位數(shù)字)
  25. (?<=\s)\w+(?=\s) (由空格符分隔開的字母數(shù)字字符串)
  negative lookaround
  之前有提到,如何查找一個(gè)非特定或非在特定群組的字符。但如果只是要驗(yàn)證某字符不存在而不要對(duì)應(yīng)這些字符進(jìn)來呢?舉個(gè)例子來說,假設(shè)要查找一個(gè)字,它的字母里有q但接下來的字母不是u,可以用下列的re來做。
  26. \b\w*q[^u]\w*\b (一個(gè)字,其字母里有q但接下來的字母不是u)
  這樣的re會(huì)有一個(gè)問題,因?yàn)閇^u]要對(duì)應(yīng)一個(gè)字符,所以若q是字的最后一個(gè)字母,[^u]這樣的下法就會(huì)將空格符對(duì)應(yīng)下去,結(jié)果就有可能會(huì)符合二個(gè)字,比如說”iraq haha”這樣的文字。使用negative lookaround就能解決這樣的問題。
  27. \b\w*q(?!u)\w*\b (一個(gè)字,其字母里有q但接下來的字母不是u)
  這是”zero-width negative lookahead assertion”。
  28. \d{3}(?!\d) (三個(gè)位的數(shù)字,其后不接一個(gè)位數(shù)字)
  同樣的,可以使用(?<!exp),”zero-width negative lookbehind assertion”,來符合前面沒接exp前綴的文字符串。
  29. (?<![a-z ])\w{7} (七個(gè)字母數(shù)字的字符串,其前面沒接字母或空格)
  30. (?<=<(\w+)>).*(?=<\/\1>) (html卷標(biāo)間的文字)
  這使用lookahead及l(fā)ookbehind assertion來取出html間的文字,不包括html卷標(biāo)。
  請(qǐng)批注(comments please)
  括號(hào)還有個(gè)特殊的用途就是用來包住批注,語法為”(?#comment)”,若設(shè)定”ignore pattern whitespace”選項(xiàng),則re中的空格符當(dāng)re使用時(shí)會(huì)乎略。此選項(xiàng)設(shè)定時(shí),”#”之后的文字會(huì)乎略。
  31. html卷標(biāo)間的文字,加上批注
  (?<=  #查找前綴,但不包含它
  <(\w+)> #html標(biāo)簽
  ) #結(jié)束查找前綴
  .* #符合任何文字
  (?= #查找字尾,但不包含它
  <\/\1> #符合所抓取群組1之字符串,也就是前面小括號(hào)的html標(biāo)簽
  ) #結(jié)束查找字尾
  尋找最多字符的字及最少字符的字(greedy and lazy)
  當(dāng)re下要查找一個(gè)范圍的重復(fù)時(shí)(如”.*”),它通常會(huì)尋找最多字符的符合字,也就是greedy matching。舉例來說。
  32. a.*b (開始為a結(jié)束為b的最多字符的符合字)
  若有一字符串是”aabab”,使用上述re所得到的符合字符串就是”aabab”,因?yàn)檫@是尋找最多字符的字。有時(shí)希望是符合最少字符的字也就是 lazy matching。只要將重復(fù)前述項(xiàng)目的表加上問號(hào)(?)就可以把它們?nèi)孔兂蒷azy matching。因此”*?”代表的就是重復(fù)任意 次數(shù),但是使用最少重復(fù)的次數(shù)來符合。舉個(gè)例子來說:
  33. a.*?b (開始為a結(jié)束為b的最少字符的符合字)
  若有一字符串是”aabab”,使用上述re第一個(gè)所得到的符合字符串就是”aab”再來是”ab”,因?yàn)檫@是尋找最少字符的字。
  *? 重復(fù)任意次數(shù),最少重復(fù)次數(shù)為原則
  +? 重復(fù)至少一次,最少重復(fù)次數(shù)為原則
  ?? 重復(fù)零次或一次,最少重復(fù)次數(shù)為原則
  {n,m}? 重復(fù)至少n次,但不超過m次,最少重復(fù)次數(shù)為原則
  {n,}? 重復(fù)至少n次,最少重復(fù)次數(shù)為原則
還有什么沒提到呢?
  到目前為止,已經(jīng)提到了許多建立re的元素,當(dāng)然還有許多元素沒有提到,下表整理了一些沒提到的元素,在最左邊的字段的數(shù)字是說明在expresso中的例子。
  # 語法 說明
  \a bell 字符
  \b 通常是指字的邊界,在字符組里所代表的就是backspace
  \t tab
  34 \r carriage return
  \v vertical tab
  \f from feed
  35 \n new line
  \e escape
  36 \nnn ascii八位碼為nnn的字符
  37 \xnn 十六位碼為nn的字符
  38 \unnnn unicode為nnnn的字符
  39 \cn control n字符,舉例來說ctrl-m是\cm
  40 \a 字符串的開始(和^相似,但不需籍由multiline選項(xiàng))
  41 \z 字符串的結(jié)尾
  \z 字符串的結(jié)尾
  42 \g 目前查找的開始
  43 \p{name} unicode 字符組名稱為name的字符,比如說\p{lowercase_letter} 所指的就是小寫字
  (?>exp) greedy次描述,又稱之為non-backtracking次描述。這只符合一次且不采backtracking。
  44 (?<x>-<y>exp)
  or (?-<y>exp) 平衡群組。雖復(fù)雜但好用。它讓已命名的抓取群組可以在堆棧中操作使用。(小弟對(duì)這個(gè)也是不太懂哩)
  45 (?im-nsx:exp) 為次描述exp更改re選項(xiàng),比如(?-i:elvis)就是把elvis大乎略大小寫的選項(xiàng)關(guān)掉
  46 (?im-nsx) 為之后的群組更改re選項(xiàng)。
  (?(exp)yesno) 次描述exp視為zero-width positive lookahead。若此時(shí)有符合,則yes次描述為下一個(gè)符合標(biāo)的,若否,則no 次描述為下一個(gè)符合標(biāo)的。
  (?(exp)yes) 和上述相同但無no次描述
  (?(name)yesno) 若name群組為有效群組名稱,則yes次描述為下一個(gè)符合標(biāo)的,若否,則no 次描述為下一個(gè)符合標(biāo)的。
  47 (?(name)yes) 和上述相同但無no次描述
  結(jié)論
  經(jīng)過了一連串的例子,及expresso的幫忙,相信各位大大對(duì)re有個(gè)基本的了解,網(wǎng)絡(luò)上當(dāng)然有許多有關(guān)于re的文章,如果各位大大有興趣http://www.codeproject.com 還有許多關(guān)于re的相關(guān)文章。

相關(guān)文章

最新評(píng)論