javascript中的Regex的貪婪模式和非貪婪模式講解

來源:互聯網
上載者:User

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

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

從指定字串中取得url資訊

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML>
 <HEAD>
  <TITLE> javascript 測試 </TITLE>
  <META NAME="Generator" CONTENT="EditPlus">
  <META NAME="Author" CONTENT="">
  <META NAME="Keywords" CONTENT="">
  <META NAME="Description" CONTENT="">
 </HEAD>

 <BODY>
  <script type="text/javascript">
var str = "<h2 style=\"font-size: 12px; margin-bottom:5px; padding-bottom:5px\"><a href  =   \"http://www.my400800.cn\" title=\"400電話\">400電話 </a></h2>";

var patt=/<a.*?[=][ ]{0,}[\"\']{1,1}(.*?)[\"\']{1,1}.*?>/g;
   //patt.compile(patt);
//var patt = new RegExp(/W3*hool/img,"g");
var result;
while ((result = patt.exec(str)) != null) {
    document.write(result[1]);
   document.write("<br />");
   document.write(patt.lastIndex);
   document.write("<br />");
}
</script>
 </BODY>
</HTML>

 

輸出結果:

http://www.my400800.cn
119

 

 

 

3、複雜模式 分為分組,反向引用,候選,非捕獲性分組,前瞻,邊界定位器和多行模式等
  1)、分組,
引入()的概念,其文法是(pattern),即將“pattern”部分組合成一個可以統一操作的組合項或 子匹配,也就是說用括弧括起一些字元,字元類或者量詞等,每個捕獲的字匹配項按照其出現的順序儲存在緩衝區中。 如:/(abc){3}/如過匹配的字串是wcabcabcabc的話則可以匹配到的字串是abcabcabc
  2)、反向引用  分組得到的子匹配,Regex後面的部分,可以引用前面分組的子匹配中已經匹配到的字 符串,這稱之為反向引用 文法是\num,即可以引用編號為num的內容 其值是1-99的整數 如:/(\w)\2{2}/ 其中\2{2}表示子匹配 如果/\w{5}/可以匹配目標字串中連續出現的幾個字元,則可以是用/\w\1{5}/來匹配。Regex/<(\w+)\s*(\w+(= ('|").*?\4)?\s*)*>.*?</\1>/就可以匹配<td id="td2" style="float:left"></td> 這裡的\1就是匹配的第一個括弧中\w+的內容。
  3)、候選: 即用“|”來表示匹配的運算式之間的或關係,文法是運算式|運算式,兩個運算式是或的關係。如匹配有線電話號碼 有3位區號8位號碼和4位區號7位號碼這兩類,在寫Regex的時候就可以寫/(((\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的“非”,即是匹配一個非單詞邊界。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.