上一節總結了建立正則表達式的語法,這一篇筆者總結了用於模式匹配的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
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 '<' : '<', 4 '>' : '>', 5 '&' : '&', 6 '"' : '"'
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爲<>>&
(3)str.match(regexp)
定義:讓字符串和一個正則表達式進行匹配,而且是依據g標識來決定如何匹配。
1 String.prototype.entityify = function(){ 2 var character = { 3 '<' : '<', 4 '>' : '>', 5 '&' : '&', 6 '"' : '"'
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分割成片斷來建立一個字符串數組。
參數:
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 '<' : '<', 4 '>' : '>', 5 '&' : '&', 6 '"' : '"'
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 & fxt'); //output爲true
好了,關於模式匹配的方法已經羅列出來,接下來要將一些關於正則的實例,都是較爲經典而且實用的~