JS中的replace(RegExp, Function)

本文详细解析了 JavaScript 中 String.prototype.replace 方法的使用,特别是当 replace 参数为函数时的行为。通过实例代码展示了如何利用该方法进行字符串操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近看Qwrap代码,查阅了一些关于replace里function参数的问题。

ECMScript文档里写的是

String.prototype.replace (searchValue, replaceValue)

如果 replaceValue 是函数,则对每个匹配的子字符串,以 m + 3 个参数调用这个函数。第一个参数是匹配的子字符串。如果 searchValue 是正则表达式,接下来 m 个参数是 MatchResult(见 15.10.2.1)里的所有捕获值。第 m + 2 个参数是发生的匹配在 string 里的偏移量,第 m + 3 个参数是 string。结果是将输入的原字符串里的每个匹配子字符串替换为相应函数调用的返回值(必要的情况下转换为字符串)得到的字符串。

http://ecmascript.cn/#387

 

 

runcode

<html> <body> <script> var QW={}; /** * @class Browser js的运行环境,浏览器以及版本信息。(Browser仅基于userAgent进行嗅探,存在不严谨的缺陷。) * @singleton * @namespace QW */ QW.Browser = (function() { var na = window.navigator, ua = na.userAgent.toLowerCase(), browserTester = /(msie|webkit|gecko|presto|opera|safari|firefox|chrome|maxthon|android|ipad|iphone|webos|hpwos)[ \/os]*([\d_.]+)/ig, Browser = { platform: na.platform }; ua.replace(browserTester, function(a, b, c) { var bLower = b.toLowerCase(); for(var i = 0;i < arguments.length;i++){    document.write("第"+(i+1)+"个参数的值:"+arguments[i]+"<br />");   } if (!Browser[bLower]) { Browser[bLower] = c; } }); if (Browser.opera) { //Opera9.8后版本号位置变化 ua.replace(/opera.*version\/([\d.]+)/, function(a, b) { Browser.opera = b; }); } if (Browser.msie) { Browser.ie = Browser.msie; var v = parseInt(Browser.msie, 10); Browser['ie' + v] = true; } return Browser; }()); if (QW.Browser.ie) { try { document.execCommand("BackgroundImageCache", false, true); } catch (e) {} } </script> </body> </html>

运行代码  [Ctrl+A 全部选择 提示:你可先修改部分代码,再按运行]

 

第一个参数得到的是匹配的整体字符串

然后依次的参数得到的是括号包括的子字符串

倒数第二个参数是字符串的偏移量

最后一个参数返回的是整个字符串。

 

https://developer.mozilla.org/zh-CN/docs/JavaScript/Reference/Global_Objects/String/replace

转载于:https://www.cnblogs.com/myzykj/archive/2013/02/22/2919115.html

### JavaScript 中 `replace()` 函数的使用说明 `replace()` 是 JavaScript 的字符串方法之一,用于在一个字符串中查找指定的内容并将其替换为新的内容。该函数支持通过子字符串或者正则表达式来定义要被替换的部分。 #### 基本语法 以下是 `replace()` 方法的基本语法: ```javascript str.replace(regexp|substr, newSubStr|function) ``` - **regexp 或 substr**: 要被替换的目标内容,可以是一个具体的子字符串或者是正则表达式。 - **newSubStr 或 function**: 替换目标内容的新字符串,也可以提供一个回调函数来自定义替换逻辑。 如果第一个参数是非全局模式(即不带 `/g`),那么只有第一次匹配会被替换;如果是全局模式,则会替换所有的匹配项[^2]。 #### 示例代码 下面是一些常见的例子展示如何使用 `replace()`: ##### 非全局替换示例 当未设置全局标志 (`/g`) 时,仅首次出现的目标会被替换掉。 ```javascript const str = 'The normal function of the normal distribution.'; // 定义非全局正则表达式 const regex2 = /normal/; const str2 = str.replace(regex2, 'beta'); console.log('替换后的字符串为(不是全局匹配):' + str2); ``` 运行上述代码的结果将是只替换了首个 `"normal"` 实例。 ##### 全局替换示例 为了实现整个字符串中的所有实例都被替换,需采用带有全局标志 (`/g`) 的正则表达式。 ```javascript const str = 'The normal function of the normal distribution.'; // 定义全局正则表达式 const regex3 = /normal/g; const str3 = str.replace(regex3, 'beta'); console.log('替换后的字符串为(是全局匹配):' + str3); ``` 此段脚本将会把原句里的每一个 `"normal"` 字样都改为 `"beta"`[^2]。 ##### 利用回调函数动态修改 除了简单的文字替代外,还可以传递一个函数作为第二个参数,从而允许更复杂的操作。 ```javascript const pattern = /\b(\w+)(\s+\1)+\b/gi; const text = 'foo foo bar Bar Foo'; const result = text.replace(pattern, (match, p1) => { return p1.charAt(0).toUpperCase() + p1.slice(1); }); console.log(result); // 输出:"Foo BAR FOO" ``` 这里展示了利用匿名函数依据特定规则转换重复单词首字母大写的情况[^1]。 ### 注意事项 虽然 `replace()` 提供了强大的功能来进行文本处理,但它并不适用于多步复杂变换场景,在这种情况下可能需要考虑其他工具库比如 Lodash 等辅助完成任务。 问题
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值