主頁 > 知識庫 > Further Study of Rugular Expresions第1/2頁

Further Study of Rugular Expresions第1/2頁

熱門標(biāo)簽:銀行業(yè)務(wù) 科大訊飛語音識別系統(tǒng) 團(tuán)購網(wǎng)站 服務(wù)器配置 Linux服務(wù)器 電子圍欄 Mysql連接數(shù)設(shè)置 阿里云
小弟便興起了學(xué)一學(xué)re的想法,但小弟天生就比較懶一些,總希望看有沒有些快速學(xué)習(xí)的方式,于是小弟又請出google大神,藉由祂的神 力,小弟在網(wǎng)絡(luò)上找到了jim hollenhorst先生的文章,經(jīng)過了閱讀,小弟覺得真是不錯,所以就做個小心得報告,跟move-to.net的朋 友分享,希望能為各位大大帶來一丁點在學(xué)習(xí)re時的幫助。jim hollenhorst大大文章之網(wǎng)址如下,有需要的大大可直接連結(jié)。
  the 30 minute regex tutorial by jim hollenhorst
  http://www.codeproject.com/useritems/regextutorial.asp
  什么是re?
  想必各位大大在做文件查找的時侯都有使用過萬用字符”*”,比如說想查找在windows目錄下所有的word文件時,你可能就會用”*.doc”這樣的方式來做查找,因為”*”所代表的是任意的字符。re所做的就是類似這樣的功能,但其功能更為強大。
  寫程序時,常需要比對字符串是否符合特定樣式,re最主要的功能就是來描述這特定的樣式,因此可以將re視為特定樣式的描述式,舉個例子來說,”\ w +”所代表的就是任何字母與數(shù)字所組成的非空字符串(non-null string)。在.net framework中提供了非常強大的類別庫, 藉此可以很輕易的使用re來做文字的查找與取代、對復(fù)雜標(biāo)頭的譯碼及驗證文字等工作。
  學(xué)習(xí)re最好的方式就是藉由例子親自來做做看。jim hollenhorst大大也提供了一個工具程序expresso(來杯咖啡吧),來幫助我們學(xué)習(xí)re,下載的網(wǎng)址是http://www.codeproject.com/useritems/regextutorial/expressosetup2_1c.zip。
  接下來,就讓我們來體驗一些例子吧。
  一些簡單的例子
  假設(shè)要查找文章中elvis后接有alive的文字符串的話,使用re可能會經(jīng)過下列的過程,括號是所下re的意思:
  1. elvis (查找elvis)
  上述代表所要查找的字符順序為elvis。在.net中可以設(shè)定乎略字符的大小寫,所以”elvis”、”elvis”或者是”elvis”都是符合 1 所下的re。但因為這只管字符出現(xiàn)的順序為elvis,所以pelvis也是符合1所下的re??梢杂?的re來改進(jìn)。
  2. \belvis\b (將elvis視為一整體的字查找,如elvis、elvis乎略字符大小寫時)
“\b”在re中有特別的意思,在上述的例子中所指的就是字的邊界,所以\belvis\b用\b把elvis的前后邊界界定出來,也就是要elvis這個字。
  假設(shè)要將同一行里elvis后接有alive的文字符串找出來,此時就會用到另外二個特別意義的字符”.”及”*”。”.”所代表就是除了換行字符的 任意字符,而”*”所代表的是重復(fù)*之前項目直到找到符合re的字符串。所以”.*”所指的就是除了換行字符外的任意數(shù)目的字符數(shù)。所以查找同一行里 elvis后接有alive的文字符串找出來,則可下如3之re。
  3. \belvis\b.*\balive\b (查找elvis后面接有alive的文字符串,如elvis is alive)
  用簡單之特別字符就可以組成功能強大的re,但也發(fā)現(xiàn)當(dāng)使用越來越多的特別字符時,re就會越來越難看得懂了。
再看看另外的例子
  組成有效的電話號碼
  假使要從網(wǎng)頁上收集顧客格式為xxx-xxxx的7位數(shù)字的電話號碼,其中x是數(shù)字,re可能會這樣寫。
  4. \b\d\d\d-\d\d\d\d (查找七位數(shù)字之電話號碼,如123-1234)
  每一個\d代表一個數(shù)字?!?”則是一般的連字符號,為避免太多重復(fù)的\d,re可以改寫成如5的方式。
  5. \b\d{3}-\d{4} (查找七位數(shù)字電話號碼較好的方法,如123-1234)
  在\d后的{3},代表重復(fù)前一個項目三次,也就是相等于\d\d\d。
  re的學(xué)習(xí)及測試工具 expresso
  因為re不易閱讀及使用者容易會下錯re的特性,jim大大開發(fā)了一個工具軟件expresso,用來幫助使用者學(xué)習(xí)及測試re,除了上面所述的網(wǎng)址之外,也可以上ultrapico網(wǎng)站(http://www.ultrapico.com)。安裝完expresso后,在expression library中,jim大大把文章的例子都建立在其中,可以邊看文章邊測試,也可以試著修改范例所下的re,馬上可以看到結(jié)果,小弟覺得非常好用。各位大大可以試試。
  .net中re的基礎(chǔ)概念
  特殊字符
  有些字符有特別的意義,比如之前所看到的”\b”、”.”、”*”、”\d”等?!盶s”所代表的是任意空格符,比如說spaces、tabs、newlines等.?!盶w”代表是任意字母或數(shù)字字符。
  再看一些例子吧
  6. \ba\w*\b (查找a開頭的字,如able)
  這re描述要查找一個字的開始邊界(\b),再來是字母”a”,再加任意數(shù)目的字母數(shù)字(\w*),再接結(jié)束這個字的結(jié)束邊界(\b)。
  7. \d+ (查找數(shù)字字符串)
  “+”和”*”非常相似,除了+至少要重復(fù)前面的項目一次。也就是說至少有一個數(shù)字。
  8. \b\w{6}\b (查找六個字母數(shù)字的字,如ab123c)
  下表為re常用的特殊字符
  . 除了換行字符的任意字符
  \w 任意字母數(shù)字字符
  \s 任意空格符
  \d 任意數(shù)字字符
  \b 界定字的邊界
  ^ 文章的開頭,如”^the'' 用以表示出現(xiàn)于文章開頭的字符串為”the”
  $ 文章的結(jié)尾,如”end$”用以表示出現(xiàn)在文章的結(jié)尾為”end”
  特殊字符”^”及”$”是用來查找某些字必需是文章的開頭或結(jié)尾,這在驗證輸入是否符合某一樣式時特別用有,比如說要驗證七位數(shù)字的電話號碼,可能會輸入如下9的re。
  9. ^\d{3}-\d{4}$ (驗證七位數(shù)字之電話號碼)
  這和第5個re相同,但其前后都無其它的字符,也就是整串字符串只有這七個數(shù)字的電話號碼。在.net中如果設(shè)定multiline這個選項,則”^”和”$”會每行進(jìn)行比較,只要某行的開頭結(jié)尾符合re即可,而不是整個文章字符串做一次比較。
  轉(zhuǎn)意字符(escaped characters)
  有時可能會需要”^”、”$”單純的字面意義(literal meaning)而不要將它們當(dāng)成特殊字符,此時”\”字符就是用來移除特殊字符特別意義的字符,因此”\^”、”\.”、”\\”所代表的就是”^”、”.”、”\”的字面意義。
  重復(fù)前述項目
  在前面看過”{3}”及”*”可以用來重復(fù)前述字符,之后我們會看到如何用同樣的語法重復(fù)整個次描述(subexpressions)。下表是使用重復(fù)前述項目的一些方式。
  * 重復(fù)任意次數(shù)
  + 重復(fù)至少一次
  ? 重復(fù)零次或一次
  {n} 重復(fù)n次
  {n,m} 重復(fù)至少n次,但不超過m次
  {n,} 重復(fù)至少n次
  再來試一些例子吧
  10. \b\w{5,6}\b (查找五個或六個字母數(shù)字字符的字,如as25d、d58sdf等)
  11. \b\d{3}\s\d{3}-\d{4} (查找十個數(shù)字的電話號碼,如800 123-1234)
  12. \d{3}-\d{2}-\d{4} (查找社會保險號碼,如 123-45-6789)
  13. ^\w* (每行或整篇文章的第一個字)
  在espresso可試試有multiline和沒multiline的不同。
  匹配某范圍的字符
  有時需要查找某些特定的字符時怎么辨?這時中括號”[]”就派上了用場。因此[aeiou]所要查找的是”a”、”e”、”i”、”o”、”u”這些 元音,[.?!]所要查找的是”.”、”?”、”!”這些符號,在中括號中的特殊字符的特別意義都會被移除,也就是解譯成單純的字面意義。也可以指定某些 范圍的字符,如”[a-z0-9]”,所指的就是任意小寫字母或任意數(shù)字。
  接下來再看一個比較初復(fù)雜查找電話號碼的re例子
  14. \(?\d{3}[( ] \s?\d{3}[- ]\d{4} (查找十位數(shù)字之電話號碼,如(080) 333-1234 )
  這樣的re可查找出較多種格式的電話號碼,如(080) 123-4567、511 254 6654等。”\(?”代表一個或零個左小括號”(“, 而”[( ]”代表查找一個右小括號”)”或空格符,”\s?”指一個或零個空格符組。但這樣的re會將類似”800) 45-3321”這樣的電話找出 來,也就是括號沒有對稱平衡的問題,之后會學(xué)到擇一(alternatives)來決解這樣的問題。
  不包含在某特定字符組里(negation)
  有時需要查找在包含在某特定字符組里的字符,下表說明如何做類似這樣的描述。
  \w 不是字母數(shù)字的任意字符
  \s 不是空格符的任意字符
  \d 不是數(shù)字字符的任意字符
  \b 不在字邊界的位置
  [^x] 不是x的任意字符
  [^aeiou] 不是a、e、i、o、u的任意字符
  15. \s+ (不包含空格符的字符串)
  擇一(alternatives)
  有時會需要查找?guī)讉€特定的選擇,此時””這個特殊字符就派上用場了,舉例來說,要查找五個數(shù)字及九個數(shù)字(有”-”號)的郵政編碼。
  16. \b\d{5}-\d{4}\b\b\d{5}\b (查找五個數(shù)字及九個數(shù)字(有”-”號)的郵政編碼)
  在使用alternatives時需要注意的是前后的次序,因為re在alternatives中會優(yōu)先選擇符合最左邊的項目,16中,如果把查找五個數(shù)字的項目放在前面,則這re只會找到五個數(shù)字的郵政編碼。了解了擇一,可將14做更好的修正。
12下一頁閱讀全文

標(biāo)簽:萍鄉(xiāng) 江蘇 衢州 蚌埠 廣元 衡水 大理 棗莊

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《Further Study of Rugular Expresions第1/2頁》,本文關(guān)鍵詞  ;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請?zhí)峁┫嚓P(guān)信息告之我們,我們將及時溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 收縮
    • 微信客服
    • 微信二維碼
    • 電話咨詢

    • 400-1100-266