用於模式匹配的String方法和RegExp方法

  上一節總結了建立正則表達式的語法,這一篇筆者總結了用於模式匹配的String四個方法:search()、replace()、match()、split()以及用於模式匹配的RegExp兩個方法exec()、test()javascript

String類html

(1)str.search(regexp)java

定義:search()方法將在字符串str中檢索與表達式regexp相匹配的字串,而且返回第一個匹配字串的第一個字符的位置。若是沒有找到任何匹配的字串,則返回-1。git

example:正則表達式

「JavaScript」.search(/script/i);      //output爲4

  可是,search()方法不支持全局檢索,由於會忽略正則表達式參數的標識g,而且也忽略了regexp的lastIndex屬性,老是從字符串的開始位置進行檢索,因此它會老是返回str的第一個匹配的位置。數組


(2)str.replace(searchValue, replaceValue)函數

定義:replace方法對string進行查找和替換操做,並返回一個新的字符串。this

參數:spa

  • searchValue  能夠是一個字符串或者是一個正則表達式對象。
    若是是一個字符串,那麼searchValue只會在第一次出現的地方被替換,eg:
    var result = "mother_in_law".replace( '_' , '+' );    //output爲mother+in_law

    若是是一個正則表達式而且帶有g標識,它會替換全部的匹配,若是沒有自帶g標識,它會替換第一個匹配prototype

    var str = "javascript"; str.replace(/javascript/,'JavaScript');     //將字符串javascript替換爲JavaScript
    str.replace(/a/g, 'b');                     //將全部的字母a替換爲字母b,返回 jbvbscript

     

  • replaceValue     能夠是一個字符串也能夠是一個函數。
    若是是一個字符串,則注意字符$擁有特別的含義

    var oldareacode = /\((\d{3})\)/g; var p = '(0663)1234567'.replace(oldareacode,'$1-');    //output爲0663-1234567



    若是是一個函數,那麼每次遇到一個匹配函數就會被調用一次,而該函數返回的字符串會被用做替換文本。傳遞給這個函數的第一個參數是整個被匹配的文本,第二個參數是分組1捕獲的文本,第三個參數是分組2捕獲的文本,以此類推:

     1 String.prototype.entityify = function(){  2     var character = {  3         '<'  : '&lt;',  4         '>'     : '&gt;',  5         '&'  : '&amp;',  6         '"'  : '&quot;'
     7  };  8 
     9     return function(){ 10         return this.replace(/[<>&"]/g,function(c){ 11  console.log(c); 12             return character[c]; 13  }); 14  }; 15 }(); 16 alert("<>>&".entityify());   //alert爲&lt;&gt;&gt;&amp;

     

(3)str.match(regexp)

定義:讓字符串和一個正則表達式進行匹配,而且是依據g標識來決定如何匹配。

  • 若是regexp沒帶g標識,那麼調用string.match(regexp)的結果與調用regexp.exec(string)的結果同樣
  • 若是regexp帶有g標識,那他將生成全部的匹配(除了捕獲分組以外)的數組
    example:
     1 String.prototype.entityify = function(){  2     var character = {  3         '<' : '&lt;',  4         '>' : '&gt;',  5         '&' : '&amp;',  6         '"' : '&quot;'
     7  };  8 
     9     return function(){ 10         return this.replace(/[<>*&"]/g,function(c){ 11             return character[c]; 12  }); 13  }; 14 }(); 15 
    16 /** 17  * string.match(regexp) 18  */
    19 var text = '<html><body bgcolor=linen><p>' + 'This is <b>bold</b>!</p></body></html>'; 20 var tags = /[^<>]+|<(\/?)([A-Za-z]+)([^<>]*)>/g; 21 var a,i; 22 a = text.match(tags); 23 for(i = 0;i < a.length;i += 1){ 24     document.writeln(('// [' + i + '] ' + a[i]).entityify()); 25     document.writeln('<br>'); 26 } 27 document.writeln('<br>');

    輸出結果爲: 

(4)str.split(separator,limit)

定義:將string分割成片斷來建立一個字符串數組。
參數:

  • limit     可選參數,用來限制被分割片斷的數量。
    eg:var digits = '0123456789';var a = digits.split('',5);   輸出結果爲:['0','1','2','3','4'0];
  • separator  能夠爲一個字符串或者一個正則表達式
    若是是字符串,則會返回一個分割後的數組
    example:
    var a = '192.168.1.113'.split('.');alert(a);    //輸出爲數組['192','168','1','113']
    var b = ' |a|b|c|*'.split('|');alert(b);           //輸出爲數組['','a','b','c','*'],注意第一個元素是一個空格!!!

    若是是正則表達式,則例子以下:

    var text = 'i, am ,   gdt'; var d = text.split(/\s*,\s*/); alert(d); //輸出數組['i','am','gdt']

     

RegExp對象

(1)regexp.exec(string)

 定義:成功匹配regexp和字符串string,則返回一個數組,數組中下標爲0的元素將包含正則表達式regexp匹配的子字符串,下標爲1的元素是分組1捕獲的文本,下標爲2的元素是分組2捕獲的文本,依次列推,若是匹配失敗,則返回null

  若是regexp帶有一個g標識,查找不是從這個字符串的起始位置開始,而是從regexp.lastIndex(初始值爲0)開始,若是匹配成功,那麼regexp.lastIndex將被設置爲改匹配後的第一個字符的位置,不成功的匹配會重置regexp.lastIndex爲0。

仍是用例子來體現吧,example:

 1 String.prototype.entityify = function(){  2     var character = {  3         '<' : '&lt;',  4         '>' : '&gt;',  5         '&' : '&amp;',  6         '"' : '&quot;'
 7  };  8 
 9     return function(){ 10         return this.replace(/[<>*&"]/g,function(c){ 11             return character[c]; 12  }); 13  }; 14 }(); 15 
16 /** 17  * regexp.exec(string) 18  */
19 var text = '<html><body bgcolor=linen><p>' + 'This is <b>bold</b>!</p></body></html>'; 20 var tags = /[^<>]+|<(\/?)([A-Za-z]+)([^<>]*)>/g; 21 var a,i; 22 while((a = tags.exec(text))){ 23     for(i = 0;i < a.length;i += 1){ 24         document.writeln(('// [' + i + '] ' + a[i]).entityify()); 25         document.writeln('<br>'); 26  } 27     document.writeln('<br>'); 28     
29 }

輸出結果爲:

  這個例子和string.match(regexp)中的例子很類似,不過能夠直觀看出regexp.exec(string)返回的是一個二維數組,而string.match(regexp)則是返回一個一維數組,還有兩個的用法使用對象不一樣,注意不要寫錯

(2)regexp.test(string)

定義:若是該regexp成功匹配string,返回true,不然返回false(test方法是使用正則最簡單和最快的方法,而exec是使用正則最強大同時也是最慢的方法)

example:

  var b = /&.+;/.test('gdt &amp; fxt');            //output爲true

 

  

  好了,關於模式匹配的方法已經羅列出來,接下來要將一些關於正則的實例,都是較爲經典而且實用的~

相關文章
相關標籤/搜索