爲了簡化替換子字符串的操做,ECMAScript提供了replace()方法。這個方法接收兩個參數:第一個參數能夠是一個字符串(這個字符串不會轉換成正則表達式)或者是一個RegExp函數。若是第一個參數是字符串,那麼只會替換第一個子字符串。要想替換全部子字符串,惟一的辦法就是提供一個正則表達式,而且要指定全局(g)標誌。replace()方法第二個參數也能夠是一個函數。javascript
StringObject.replace(searchValue,replaceValue)html
1.StringObject:字符串java
2.searchValue:字符串或正則表達式正則表達式
3.replaceValue:字符串或者函數函數
若是第一個參數是字符串,只會替換第一個子字符串。url
var text = 'cat,bat,sat,fat'; var result = text.replace('at','ond'); alert(result); //cond,bat,sat,fat
var newStr = 'I am loser,You are loser'.replace('loser','hero'); alert(newStr);//I am hero,You are loser
若是第一個參數是正則表達式,就會替換全部子字符串。spa
var text = 'cat,bat,sat,fat'; var result = text.replace(/at/g,'ond'); alert(result); //cond,bond,sond,fond
var newStr = 'I am loser,You are loser'.replace(/loser/g,'hero'); alert(newStr);//I am hero,You are hero
若是第二個參數是字符串的話,還能夠用特殊的字符序列,將這則表達式操做獲得的值插入結果字符串中。(若是字符串中有幾個特定字符的話,會被轉換爲特定字符串)。.net
字符序列 | 替換文本 |
$$ | $ |
$& | 匹配整個模式的子字符串 |
$` | 匹配子字符串以前的子字符串 |
$' | 匹配子字符串以後的子字符串 |
$n | 匹配第n個捕獲組的子字符串,(n = 0~9)。如:$1匹配第一個捕獲的子字符串,$2是匹配第二個捕獲的子字符串。以此類推 |
$nn | 匹配第n個捕獲組的子字符串,(n = 01~99)。如:$01匹配第一個捕獲的子字符串,$02是匹配第二個捕獲的子字符串。以此類推 |
var oldStr='討論一下正則表達式中的replace的用法'; var newStr = oldStr.replace(/正則表達式/,'{$&}'); alert(newStr);//討論一下{正則表達式}中的replace的用法
var str1 = 'A@B'.replace(/@/,"$`"); //AAB 匹配左側 var str2 = 'A@B'.replace(/@/,"$'"); //ABB 匹配右側
var str1 = 'haiandao1@163.com'.replace(/(.+)(@)(.*)/,"$2$1"); alert(str1);//@haiandao1 var str2 = 'haiandao1@163.com'.replace(/(.+)(@)(.*)/,"$3$2$1"); console.log(str2);//163.com@haiandao1
第二個參數傳入函數的方式,在只有一個模式匹配項(與模式匹配的字符串)的狀況下,會向這個函數傳遞三個參數:模式的匹配項、模式的匹配項在字符串中的位置和原始字符串。prototype
var text = 'cat,bat,sat,fat'; var result = text.replace('at',function( match , pos ,orginalText ){ /* for (var i = 0; i < arguments.length; i++) { console.log(arguments[i]); }*/ console.log(match); //at console.log(pos); //1 console.log(orginalText); //cat,bat,sat,fat return 'ond'; //返回值爲須要替換的新值 }); alert(result); //cond,bat,sat,fat
第二個參數傳入函數的方式,在正則表達式定義了多個捕獲組的狀況下,傳遞給函數的參數依次是模式的匹配項、第一個捕獲組的匹配項、第二個捕獲組的匹配項……,最後兩個參數依然分別是模式的匹配項在字符串中的位置和原始字符串。設計
var text = 'haiandao1@163.com'; var result = text.replace(/(.+)(@)(.*)/,function( match , pos ,orginalText ){ for (var i = 0; i < arguments.length; i++) { //haiandao1@163.com :模式的匹配項 //haiandao1 :第1個捕獲組的匹配項 //@ :第2個捕獲組的匹配項 //163.com :第3個捕獲組的匹配項 //0 :模式的匹配項在字符串中的位置 //haiandao1@163.com :原始字符串 console.log(arguments[i]); } return '返回值會替換掉匹配到的目標'; }); alert(result); //返回值會替換掉匹配到的目標
var text = 'haiandao1@163.com'; var result = text.replace(/(@)(.*)/,function( match , pos ,orginalText ){ for (var i = 0; i < arguments.length; i++) { //@163.com :模式的匹配項 //@ :第1個捕獲組的匹配項 //163.com :第2個捕獲組的匹配項 //9 :模式的匹配項在字符串中的位置 //haiandao1@163.com :原始字符串 console.log(arguments[i]); } return '返回值會替換掉匹配到的目標'; }); alert(result); //haiandao1返回值會替換掉匹配到的目標
function htmlEscape( text ){ return text.replace(/[<>"&]/g,function(match,pos,orginalText){ switch (match){ case '<': return '小於'; case '>': return '大於'; case '&': return '&'; case '\"': return '雙引號'; } }) } //小於p class=雙引號greeting雙引號大於helloWorld小於/p大於 console.log( htmlEscape('<p class="greeting">helloWorld</p>') );
'JAVASCRIPT'.replace(/[A-G]/g,function(){ return arguments[0].toLowerCase(); })//JaVaScRIPT
function substitute (str, obj) { if (!(Object.prototype.toString.call(str) === '[object String]')) { return ''; } if(!(Object.prototype.toString.call(obj) === '[object Object]' && 'isPrototypeOf' in obj)) { return str; } return str.replace(/\{([^{}]+)\}/g, function(match, key) { var value = obj[key]; return ( value !== undefined) ? '' + value : ''; }); }
var obj = { url: '我是超連接', title: '我是標題', text: '我是文本' }; var link = '<a href="{url}" title="{title}">{text}</a>'; substitute(link, obj);
一、JavaScript高級程序設計第三版
二、http://developer.51cto.com/art/201311/415725.htm
三、http://www.planabc.net/2011/05/31/simple_javascript_template_substitute/