a亚洲精品_精品国产91乱码一区二区三区_亚洲精品在线免费观看视频_欧美日韩亚洲国产综合_久久久久久久久久久成人_在线区

首頁 > 編程 > regex > 正文

正則表達式高級學習技巧

2020-01-20 22:26:10
字體:
來源:轉載
供稿:網友
什么是RE?
  想必各位大大在做文件查找的時侯都有使用過萬用字符”*”,比如說想查找在Windows目錄下所有的Word文件時,你可能就會用”*.doc”這樣的方式來做查找,因為”*”所代表的是任意的字符。RE所做的就是類似這樣的功能,但其功能更為強大。

  寫程序時,常需要比對字符串是否符合特定樣式,RE最主要的功能就是來描述這特定的樣式,因此可以將RE視為特定樣式的描述式,舉個例子來說,”/w+”所代表的就是任何字母與數字所組成的非空字符串(non-null string)。在.NET framework中提供了非常強大的類別庫,藉此可以很輕易的使用RE來做文字的查找與取代、對復雜標頭的譯碼及驗證文字等工作。
接下來,就讓我們來體驗一些例子吧。

  一些簡單的例子
  假設要查找文章中Elvis后接有alive的文字符串的話,使用RE可能會經過下列的過程,括號是所下RE的意思:

  1. elvis (查找elvis)

  上述代表所要查找的字符順序為elvis。在.NET中可以設定乎略字符的大小寫,所以”Elvis”、”ELVIS”或者是”eLvIs”都是符合1所下的RE。但因為這只管字符出現的順序為elvis,所以pelvis也是符合1所下的RE。可以用2的RE來改進。

  2. /belvis/b (將elvis視為一整體的字查找,如elvis、Elvis乎略字符大小寫時)
“/b”在RE中有特別的意思,在上述的例子中所指的就是字的邊界,所以/belvis/b用/b把elvis的前后邊界界定出來,也就是要elvis這個字。

  假設要將同一行里elvis后接有alive的文字符串找出來,此時就會用到另外二個特別意義的字符”.”及”*”。”.”所代表就是除了換行字符的任意字符,而”*”所代表的是重復*之前項目直到找到符合RE的字符串。所以”.*”所指的就是除了換行字符外的任意數目的字符數。所以查找同一行里elvis后接有alive的文字符串找出來,則可下如3之RE。

  3. /belvis/b.*/balive/b (查找elvis后面接有alive的文字符串,如elvis is alive)

  用簡單之特別字符就可以組成功能強大的RE,但也發現當使用越來越多的特別字符時,RE就會越來越難看得懂了。


再看看另外的例子
  組成有效的電話號碼

  假使要從網頁上收集顧客格式為xxx-xxxx的7位數字的電話號碼,其中x是數字,RE可能會這樣寫。

  4. /b/d/d/d-/d/d/d/d (查找七位數字之電話號碼,如123-1234)
  每一個/d代表一個數字。”-”則是一般的連字符號,為避免太多重復的/d,RE可以改寫成如5的方式。

  5. /b/d{3}-/d{4} (查找七位數字電話號碼較好的方法,如123-1234)
  在/d后的{3},代表重復前一個項目三次,也就是相等于/d/d/d。

  RE的學習及測試工具 Expresso

  因為RE不易閱讀及使用者容易會下錯RE的特性,Jim大大開發了一個工具軟件Expresso,用來幫助使用者學習及測試RE,除了上面所述的網址之外,也可以上Ultrapico網站。安裝完expresso后,在expression%20%20library中,jim大大把文章的例子都建立在其中,可以邊看文章邊測試,也可以試著修改范例所下的re,馬上可以看到結果,小弟覺得非常好用。各位大大可以試試。/"。安裝完Expresso后,在Expression Library中,Jim大大把文章的例子都建立在其中,可以邊看文章邊測試,也可以試著修改范例所下的RE,馬上可以看到結果,小弟覺得非常好用。各位大大可以試試。 

  .NET中RE的基礎概念
  特殊字符

  有些字符有特別的意義,比如之前所看到的”/b”、”.”、”*”、”/d”等。”/s”所代表的是任意空格符,比如說spaces、tabs、newlines等.。”/w”代表是任意字母或數字字符。

  再看一些例子吧
  6. /ba/w*/b (查找a開頭的字,如able)
  這RE描述要查找一個字的開始邊界(/b),再來是字母”a”,再加任意數目的字母數字(/w*),再接結束這個字的結束邊界(/b)。

  7. /d+ (查找數字字符串)
  “+”和”*”非常相似,除了+至少要重復前面的項目一次。也就是說至少有一個數字。

  8. /b/w{6}/b (查找六個字母數字的字,如ab123c)

  下表為RE常用的特殊字符

  . 除了換行字符的任意字符
  /w 任意字母數字字符
  /s 任意空格符
  /d 任意數字字符
  /b 界定字的邊界
  ^ 文章的開頭,如”^The'' 用以表示出現于文章開頭的字符串為”The”
  $ 文章的結尾,如”End$”用以表示出現在文章的結尾為”End”
  特殊字符”^”及”$”是用來查找某些字必需是文章的開頭或結尾,這在驗證輸入是否符合某一樣式時特別用有,比如說要驗證七位數字的電話號碼,可能會輸入如下9的RE。

  9. ^/d{3}-/d{4}$ (驗證七位數字之電話號碼)

  這和第5個RE相同,但其前后都無其它的字符,也就是整串字符串只有這七個數字的電話號碼。在.NET中如果設定Multiline這個選項,則”^”和”$”會每行進行比較,只要某行的開頭結尾符合RE即可,而不是整個文章字符串做一次比較。

  轉意字符(Escaped characters)

  有時可能會需要”^”、”$”單純的字面意義(literal meaning)而不要將它們當成特殊字符,此時”/”字符就是用來移除特殊字符特別意義的字符,因此”/^”、”/.”、”//”所代表的就是”^”、”.”、”/”的字面意義。

  重復前述項目

  在前面看過”{3}”及”*”可以用來重復前述字符,之后我們會看到如何用同樣的語法重復整個次描述(subexpressions)。下表是使用重復前述項目的一些方式。

  * 重復任意次數
  + 重復至少一次
  ? 重復零次或一次
  {n} 重復n次
  {n,m} 重復至少n次,但不超過m次
  {n,} 重復至少n次

  再來試一些例子吧

  10. /b/w{5,6}/b (查找五個或六個字母數字字符的字,如as25d、d58sdf等)
  11. /b/d{3}/s/d{3}-/d{4} (查找十個數字的電話號碼,如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]”,所指的就是任意小寫字母或任意數字。

  接下來再看一個比較初復雜查找電話號碼的RE例子

  14. /(?/d{3}[( ] /s?/d{3}[- ]/d{4} (查找十位數字之電話號碼,如(080) 333-1234 )

  這樣的RE可查找出較多種格式的電話號碼,如(080) 123-4567、511 254 6654等。”/(?”代表一個或零個左小括號”(“,而”[( ]”代表查找一個右小括號”)”或空格符,”/s?”指一個或零個空格符組。但這樣的RE會將類似”800) 45-3321”這樣的電話找出來,也就是括號沒有對稱平衡的問題,之后會學到擇一(alternatives)來決解這樣的問題。

  不包含在某特定字符組里(Negation)

  有時需要查找在包含在某特定字符組里的字符,下表說明如何做類似這樣的描述。

  /W 不是字母數字的任意字符
  /S 不是空格符的任意字符
  /D 不是數字字符的任意字符
  /B 不在字邊界的位置
  [^x] 不是x的任意字符
  [^aeiou] 不是a、e、i、o、u的任意字符

  15. /S+ (不包含空格符的字符串)

  擇一(Alternatives)

  有時會需要查找幾個特定的選擇,此時”|”這個特殊字符就派上用場了,舉例來說,要查找五個數字及九個數字(有”-”號)的郵政編碼。

  16. /b/d{5}-/d{4}/b|/b/d{5}/b (查找五個數字及九個數字(有”-”號)的郵政編碼)

  在使用Alternatives時需要注意的是前后的次序,因為RE在Alternatives中會優先選擇符合最左邊的項目,16中,如果把查找五個數字的項目放在前面,則這RE只會找到五個數字的郵政編碼。了解了擇一,可將14做更好的修正。

  17. (/(/d{3}/)|/d{3})/s?/d{3}[- ]/d{4} (十個數字的電話號碼)

  群組(Grouping)

  括號可以用來介定一個次描述,經由次描述的介定,可以針對次描述做重復或及他的處理。

  18. (/d{1,3}/.){3}/d{1,3} (尋找網絡地址的簡單RE)

  此RE的意思第一個部分(/d{1,3}/.){3},所指的是,數字最小一位最多三位,并且后面接有”.”符號,此類型的共有三個,之后再接一到三位的數字,也就是如192.72.28.1這樣的數字。

  但這樣會有個缺點,因為網絡地址數字最多只到255,但上述的RE只要是一到三位的數字都是符合的,所以這需要讓比較的數字小于256才行,但只單獨使用RE并無法做這樣的比較。在19中使用擇一來將地址的限制在所需要的范圍內,也就是0到255。

  19. ((2[0-4]/d|25[0-5]|[01]?/d/d?)/.){3}(2[0-4]/d|25[0-5]|[01]?/d/d?) (尋找網絡地址)

  有沒有發覺RE越來越像外星人說的話了?就以簡單的尋找網絡地址,直接看RE都滿難理解的哩。

  Expresso Analyzer View

  Expresso提供了一個功能,它可以將所下的RE變成樹狀的說明,一組組的分開說明,提供了一個好的除錯環境。其它的功能,如部分符合(Partial Match只查找反白RE的部分)及除外符合(Exclude Match只不查找反白RE的部分)就留給各位大大試試 主站蜘蛛池模板: 日韩在线一区二区三区 | 久久波多野结衣 | 九九热在线观看 | 在线观看亚洲a | 99精品一级欧美片免费播放 | www.日韩大片 | 欧美精品在线观看免费 | 超碰天天 | 国产一级做a爰片在线看免费 | h视频在线观看免费 | 日本一区二区三区视频免费看 | 婷婷成人在线 | 国产一区二区影院 | 人人草人人看 | 欧美三区| 精品亚洲成人 | 禁果av一区二区三区 | 亚洲精品福利视频 | 日本不卡一二三区 | 国产成人av电影 | 欧美日韩国产一区二区三区不卡 | 国产成人精品一区二区在线 | 成人免费毛片高清视频 | 国产精品1区2区3区 国产2区 | 久爱国产 | 中文字幕在线日韩 | 精品成人一区 | 黄色影片网址 | 亚洲自拍一区在线 | 在线看黄色av | 国产在线一区观看 | 午夜理伦三级 | 99国内精品久久久久久久 | 色噜| 国产最新网址 | 蜜桃av在线播放 | 国变精品美女久久久久av爽 | 毛片黄色| 另类三级| 99久久精品免费看国产免费粉嫩 | av免费在线观看网站 |