说说.replace()方法的第二个参数

首先咱们看手册:

语法

string.replace(searchvalue,newvalue)

参数值

searchvalue
必须。规定子字符串或要替换的模式的 RegExp 对象。请注意,如果该值是一个字符串,则将它作为要检索的直接量文本模式,而不是首先被转换为 RegExp 对象。

newvalue
必需。一个字符串值。规定了替换文本或生成替换文本的函数。

返回值

String
一个新的字符串,是用 replacement 替换了 regexp 的第一次匹配或所有匹配之后得到的。

第一个参数searchvalue

这个参数比较好理解,要么是字符串要么是正则表达式。上文说的“请注意,如果该值是一个字符串,则将它作为要检索的直接量文本模式,而不是首先被转换为 RegExp 对象。”,意思是'/abc/gi'不会被解析为正则对象,即使它跟正则写法一样。

本文不说第一个参数,只说第二个参数。

第二个参数newvalue

这个参数要么是普通字符串,要么是正则替换表达式字符串,说来说去都是字符串,要么是一个函数。

正则替换表达式

特殊替换字符:

字符 替换文本
& 与正则相匹配的字符串` 匹配字符串左边的字符
’ 匹配字符串右边的字符1,2,,3,…,$n 匹配结果中对应的分组匹配结果

$&

$& 适用于没有子表达式的情况

var sStr='讨论一下正则表达式中的replace的用法';
sStr.replace(/正则表达式/,'《$&》');
// 得到:"讨论一下《正则表达式》中的replace的用法"

$`

匹配字符串左边的所有字符

var sStr='讨论一下正则表达式中的replace的用法';
sStr.replace(/正则表达式/,'《$`》');
// 得到:"讨论一下《讨论一下》中的replace的用法"

$'

匹配字符串右边的所有字符,注意,既然 ' 有单引号,那么外面的引号必须双引号,如果不可以双引号,只能把' 的单引号转义。

var sStr='讨论一下正则表达式中的replace的用法';
sStr.replace(/正则表达式/,"《$'》");
// 得到:"讨论一下《中的replace的用法》中的replace的用法"

1,2,,3,…,n

依次匹配子表达式

var sStr='讨论一下正则表达式中的replace的用法';
sStr.replace(/(正则)(.+?)(式)/,"《$1》$2<$3>");
// 得到:"讨论一下《正则》表达<式>中的replace的用法"

函数

先看arguments的用法:

var sStr='讨论一下正则表达式中的replace的用法';
sStr.replace(/(正则).+?(式)/,function() {
    console.log(arguments);
});
// ["正则表达式", "正则", "式", 4, "讨论一下正则表达式中的replace的用法"]

参数分别为:

  • 匹配到的字符串(此例为"正则表达式")

  • 如果正则使用了分组匹配就为多个否则无此参数。(此例的参数就分别为 "正则", "式")

  • 匹配字符串的对应索引位置(也就是"正则表达式"的索引位置,此例为4)

  • 原始字符串

如果加上全局标识符g,则是:

var sStr='讨论一下正则表达式中的replace的正则表达式用法';
sStr.replace(/(正则).+?(式)/g,function() {
    console.log(arguments);
});
// ["正则表达式", "正则", "式", 4, "讨论一下正则表达式中的replace的正则表达式用法"]
// ["正则表达式", "正则", "式", 19, "讨论一下正则表达式中的replace的正则表达式用法"]

也就是说,arguments是当前函数的内置属性,指代当前匹配的参数伪数组。arguments[0]就是当前匹配的字符串。

var sStr='讨论一下正则表达式中的replace的正则表达式用法';
sStr.replace(/(正则).+?(式)/g,function() {
    console.log(arguments[0]);
    return arguments[0] + 'a';
});
// 正则表达式
// 正则表达式
// "讨论一下正则表达式a中的replace的正则表达式a用法"

或者使用命名形参的方式:

var sStr='讨论一下正则表达式中的replace的正则表达式用法';
sStr.replace(/(正则).+?(式)/g,function($1) {
    console.log($1);
    return $1 + 'a';
});

函数做参数的优势,在于可以对arguments做更复杂的操作,而不像只是一个字符串参数那么简陋。当然,arguments不是必须用,可以不用。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 第5章 引用类型(返回首页) 本章内容 使用对象 创建并操作数组 理解基本的JavaScript类型 使用基本类型...
    大学一百阅读 3,270评论 0 4
  • 参考博文:http://www.cnblogs.com/tugenhua0707/p/5037811.html 1...
    createEngine阅读 672评论 0 0
  • str.length 返回一个字符串的长度 返回一个字符串的长度 str.charAt(index) 返回字符串中...
    angelwgh阅读 551评论 0 0
  • 一、饵料方面的事项 在钓鱼饵料味型八字真言里,有秋香、冬甜之说,也就是说在天气转凉的深秋时节,饵料应该以香、甜为主...
    钓侠阅读 258评论 0 0
  • 在厦门有一个很特别的宾馆,与其说是宾馆还不如说是一个民宿。关键的是这个民宿仅有6个房间,两个女老板,竟然年利润超过...
    胡钧阅读 1,114评论 1 1