JavaScript replace(RegExp, Function)详解

replace的用法:string.replace(sourceText, replaceText)

先看看replace(RegExp, String) ——摘自《Windows 脚本技术.chm》::/html/js56jsmthreplace.htm

replace 方法的结果是一个完成了指定替换的 stringObj 对象的复制。(复制?副本吧?)

下面任意的匹配变量都能用来识别最新的匹配以及找出匹配的字符串。在需要动态决定替换字符串的文本替换中可以使用匹配变量。
replace(RegExp, String)

STR含义
$$ $ (JScript 5.5 或更新版本)
$& 指定与整个模式匹配的 stringObj 的部分。(JScript 5.5 或更新版本)
$` 指定由 $& 描述的匹配之前的 stringObj 部分。(JScript 5.5 或更新版本)
$' 指定由 $& 描述的匹配之后的 stringObj 部分。(JScript 5.5 或更新版本)
$n 捕获的第 n 个子匹配,此处 n 为从1到9的十进制一位数。(JScript 5.5 或更新版本)
$nn 捕获的第 nn 个子匹配,此处 nn 为从01到99的十进制两位数。(JScript 5.5 或更新版本)

感觉这些说得也很模糊,不过这不是本文的重点,就略过了

如果 replaceText 为函数,对于每一个匹配的子字符串,调用该函数时带有下面的 m+3 个参数,此处 m 是在 rgExp 中捕获的左括弧的个数。第一个参数是匹配的子字符串。接下来的 m 个参数是查找中捕获的全部结果。第 m+2 个参数是在 stringObj 中匹配出现的偏移量,而第 m+3 个参数为 stringObj。结果为将每一匹配的子字符串替换为函数调用的相应返回值的字符串值。

下面通过实例来介绍replace(RegExp, Function)的用法:
1、实体转相应的字符(配置STRUTS2时候保存编码不对,所有的中文都变成实体了。想还原,于是就有了此文)

"<!-- FilterDispatcher&#29992;&#26469;&#21021;&#22987;&#21270;Struts 2&#24182;&#19988;&#22788;&#29702;&#25152;&#26377;&#30340;HTTP&#35831;&#27714; -->"
.replace(
  /&#([^;]*);/g,
  function() {
    var args = arguments,
        len = args.length,
        //当前匹配的字符串
        match = args[0],  
        //所有分组$1, $2, ..., $n,跟上面replace(RegExp, str)中的$n一样,只不过这里的下标从0开始
        $ = Array.prototype.slice.call(args, 1, len - 2),
        //当前匹配的开始位置
        index = args[len - 2],
        //原字符串
        str = args[len -1];
    //在控制台中输出args,多亏了强大的WebKit调试工具。
    //我就是在傲游3下面靠这个弄懂的^_^
    //用傲游3或者其它带有调试功能浏览器的可以自己试一下
    //(那时候还没用Chrome,其实这货就是用了Chrome的核心 2012年2月27日)
    //console.log(args);
    
    //返回值将替代匹配的字符串
    return String.fromCharCode($[0]);
  }
)
/*
  上面那么写,只不过是想说明各个参数的含义。
  对于这个替换,其实这样就可以了:
  function(find,$1){
    return String.fromCharCode($1)
  }
*/

  

2、华氏度转摄氏度(《Windows 脚本技术.chm》中的例子)

function f2c(s) {
  var test = /(\d+(\.\d*)?)F\b/g;    // 初始化模式。
  return(s.replace
    (test,
      function($0,$1,$2) { 
        return((($1-32) * 5/9) + "C");
      }
    )
  );
}
f2c("Water freezes at 32F and boils at 212F.");

参考资料:《Windows 脚本技术.chm》::/html/js56jsmthreplace.htm


不积跬步无以至千里

不积小流无以成江海

2011年7月6日

阿良

原文地址:https://www.cnblogs.com/arliang/p/2099074.html