stringObject.replace(regexp/substr,replacement)
replacement:必需。一个字符串值。规定了替换文本或生成替换文本的函数。

1、普通的字符串

当replacement 为字符串时,如果是普通的字符串,那很简单,就是将匹配到的字符远的成该字符串。
var str = ‘hello world’; str = str.replace(/world/, ‘javascript’); console.log(str) // -> hello javascript;

2、特殊标记$

对于replace使用正则,约定了一个特殊标记$

字符 替换文本
$1、$2、… $99 与 regexp 中的第 1 到第 99 个子表达式相匹配的文本。
$& 与regexp相匹配的子串
$` 位于匹配子串左侧的文本
$’ 位于匹配子串右侧的文本
$$ 插入一个“$”

1)$i(i: 1 - 99):表示从左到右,正则子表达式(组)匹配到的文本。

  1. var name = 'Peppa Pig';
  2. name = name.replace(/(\w+)\s* \s*(\w+)/, '$2 $1');
  3. console.log(name); // -> Pig Peppa
  4. var str = '"a", "bc"';
  5. str = str.replace(/"([^"]*)"/g, "'$1'");
  6. console.log(str); // -> 'a','bc'

2) $`(tab键上方的字符):表示匹配字符串文本左边的文本

  1. var str = 'hello world';
  2. str = str.replace(/world/g, '$`');
  3. console.log(str); // -> hello hello

3)$’:表示匹配字符串右边的文本

  1. var str = 'hello world';
  2. str = str.replace(/hello/g, "$'");
  3. console.log(str); // -> world world

4)$&: 表示与正则表达式匹配的全文本

  1. var str = 'hello world';
  2. str = str.replace(/hello world/g, "$& ,fun");
  3. console.log(str); // -> hello world ,fun
  4. // 与$'组合使用
  5. var myString = "javascript";
  6. myString = myString.replace(/java/, "$&$' is ");
  7. console.log(myString); // -> javascript is script

5)$$: 表示插入一个$

  1. var str = '¥20000.00';
  2. str = str.replace(/¥/, "$$");
  3. console.log(str); // -> $20000.00

3、第二个参数为函数

  1. var str = 'abcdbc';
  2. str = str.replace(/(b)(c)/g, function() {
  3. console.log(arguments);
  4. return '&&';
  5. });
  6. console.log(str);
  7. // 输出如下:
  8. /*
  9. ["bc", "b", "c", 1, "abcdbc"]
  10. 0: "bc"
  11. 1: "b"
  12. 2: "c"
  13. 3: 1
  14. 4: "abcdbc"
  15. ...
  16. ["bc", "b", "c", 1, "abcdbc"]
  17. 0: "bc"
  18. 1: "b"
  19. 2: "c"
  20. 3: 4
  21. 4: "abcdbc"
  22. ...
  23. a&&d&&
  24. */

函数返回值表示用来替换匹配到的元素的字符串,函数参数表示:

  • param 1: 匹配到的字符串
  • param 2: 匹配的子字符串
  • param 3: 匹配的子字符串
  • param 4: 匹配到的字符串在字符串中的位置
  • param 5: 原始字符串

note: 如果匹配到的全字符串有多个,每个都会执行一次函数(有多少(n)个子字符串,第二个参数开始到第n个都是表示子串,第n+1为该子串所在全字符串中的索引位置,最后一个参数为整个字符串)

不使用函数和使用函数的区别:

  1. // 不使用函数str = '<div>"hello & world"</div>';
  2. str = str.replace(/&/g,'&amp');
  3. str = str.replace(/</g,'&lt');
  4. str = str.replace(/>/g,'&gt');
  5. str = str.replace(/"/g,'&quot');
  6. str = str.replace(/'/g,'&#39');
  7. console.log(str);
  8. // output: <div>"hello & world"</div>
  1. // 使用函数str = '<div>"hello & world"</div>';
  2. str = str.replace(/[<>\"\'\&']/g,function(a){
  3. switch(a){
  4. case '<':
  5. return '<';
  6. case '>':
  7. return '>';
  8. case '\"':
  9. return '"';
  10. case '\'':
  11. return ''';
  12. case '\&':
  13. return '&';
  14. }
  15. });
  16. console.log(str);
  17. // output: <div>"hello & world"</div>

举例:单词首字母大写:

  1. // 方法一
  2. var str = 'please make heath your first proprity';
  3. str = str.replace(/\b\w+\b/g, function(word) {
  4. return word[0].toUpperCase() + word.slice(1);
  5. });
  6. console.log(str); // -> Please Make Heath Your First Proprity
  7. // 方法二
  8. var str = 'please make heath your first proprity';
  9. str = str.replace(/(^|\s)([a-z])/g, function(word, p1, p2) {
  10. // 必须加上 p1 ,因为 p1 表示首字母前是空格或开头第一个字母;
  11. // 不理解的话,将 p1 去掉试试。
  12. return p1 + p2.toUpperCase();
  13. });
  14. console.log(str); // -> Please Make Heath Your First Proprity

举例:使用 replace来实现一个模板替换类:

  1. var formateStr = function(param, data) {
  2. return param.replace(/\{#(\w+)#\}/g, function(match, key, aa, dd) {
  3. console.log(match, key, aa, dd);
  4. return typeof data[key] === undefined ? '' : data[key];
  5. });
  6. };
  7. // 模板方法
  8. var Nav = function(data) {
  9. var _this = this;
  10. _this.item = '<li><a href="{#hrefUrl#}" title="{#title#}" {#sign#}>{#content#}</a></li>';
  11. _this.html = '<ul>';
  12. for(var i = 0, l = data.length; i < l; i++) {
  13. _this.html += formateStr(_this.item, data[i]);
  14. }
  15. _this.html += '</ul>';
  16. return _this.html;
  17. };
  18. // 扩展方法
  19. var infoNav = function(data) {
  20. var _this = this;
  21. _this.info = '<i>{#num#}</i>';
  22. for (var i = data.length - 1; i >= 0; i--) {
  23. data[i].content += formateStr(_this.info, data[i]);
  24. };
  25. return Nav.call(this, data);
  26. };
  27. var objNav = document.getElementById('nav');
  28. objNav.innerHTML = infoNav([
  29. {
  30. hrefUrl : 'http://www.baidu.com',
  31. title: '这里是百度一下',
  32. content : '百度一下',
  33. num: '10',
  34. sign: 'sign="1"'
  35. },
  36. {
  37. hrefUrl: 'http://www.zhihu.com',
  38. title: '这里是知乎一下',
  39. content: '知乎一下',
  40. num: '10',
  41. sign: 'sign="2"'
  42. }
  43. ])