javascript中的正則表達式的貪婪模式和非貪婪模式等若干問題

1、貪婪模式:根據匹配字符串以及表達式儘可能多的進行匹配,稱爲貪婪匹配模式 
   例如:/a\d+/ 即可以匹配首字母爲a的之後的許多數字,這個不進行限制 
     或者另外一種方法/a\d{2,}/也可以實現同樣的方法 

2、非貪婪模式:根據匹配字符串以及表達式儘可能少的進行匹配。使用的方法就是在修飾匹配次數的特殊符號後再加上一個?號進行限制 如"*?","+?","{n,}?","{n,m}?" 
如:/a\d+?/即匹配的字符串爲a爲首字母,後面只能有一個數字 

3、複雜模式 分爲分組,反向引用,候選,非捕獲性分組,前瞻,邊界定位符和多行模式等 
  1)、分組,
引入()的概念,其語法是(pattern),即將“pattern”部分組合成一個可以統一操作的組合項或子匹配,也就是說用括號括起一些字符,字符類或者量詞等,每個捕獲的字匹配項按照其出現的順序存儲在緩衝區中。 如:/(abc){3}/如過匹配的字符串是wcabcabcabc的話則可以匹配到的字符串是abcabcabc 
  2)、反向引用  分組得到的子匹配,正則表達式後面的部分,可以引用前面分組的子匹配中已經匹配到的字符串,這稱之爲反向引用 語法是\num,即可以引用編號爲num的內容 其值是1-99的整數 如:/(\w)\2{2}/ 其中\2{2}表示子匹配 如果/\w{5}/可以匹配目標字符串中連續出現的幾個字符,則可以是用/\w\1{5}/來匹配。正則表達式/<(\w+)\s*(\w+(=('|").*?\4)?\s*)*>.*?</\1>/就可以匹配<td id="td2" style="float:left"></td> 這裏的\1就是匹配的第一個括弧中\w+的內容。 
  3)、候選: 即用“|”來表示匹配的表達式之間的或關係,語法是表達式|表達式,兩個表達式是或的關係。如匹配座機號碼 有3位區號8位號碼和4位區號7位號碼這兩類,在寫正則表達式的時候就可以寫/(((\d{3}\)|\d{3}-)\d{8})|(((\d{4}\)|\d{4}-)\d{7})$/即表達了兩類方式如023-47854xxx或者023/47854xxx  或者0234/xxxxxxx 0234-xxxxxxx 
   4)、非捕獲性分組:其語法是(?:pattern),將pattern部分組合成爲一個可以統一進行操作的組合項,但是不把這部分內容當做子匹配捕獲,這種方法必須在進行組合,但是又不想對組合的部分進行緩存的情況下使用。如找倆單詞:programe和project  前面的pro都相同,則可以寫成/programe|project/或者是/pro(gram|ject)/,如果進行非捕獲性匹配的話就要寫成/pro(?:gram|ject)/ 
   5)、正向前瞻:語法是(?=pattern) 在目標字符串的響應位置必須要有pattern部分匹配的內容,但是不作爲匹配結果處理,不會放在緩衝區中。/windows(?=xp|7)/,只能匹配windows xp和windows7,不能匹配其他的內容 xp和7不作爲結果返回。 
   6)、負向前瞻:語法是(?!pattern) 在被搜索的字符串的相應位置不能有pattern部分表示的內容,不能將其作爲結果進行處理,也不會存在緩衝區中。 如/bed(?!room)/可以匹配bed後不是room的所有字符串 
  7)、邊界定位符:^ 與字符串開始的地方匹配,不匹配任何字符 但是如果是放在[^a-z]的時候就表示匹配除了a-z以外的字符串。$表示與字符串結束的地方匹配,也是不匹配任何的字符。\b 匹配一個單詞的邊界,也就是單詞和空格之間的位置,不匹配任何字符  \B是\b的“非”,即是匹配一個非單詞邊界。
發佈了17 篇原創文章 · 獲贊 11 · 訪問量 7萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章