语法
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用法"
函数做参数的优势,在于可以对arguments做更复杂的操作,而不像只是一个字符串参数那么简陋。当然,arguments不是必须用,可以不用。
原文链接:https://www.jianshu.com/p/31bebd90fd1d
原文地址:https://www.cnblogs.com/lvmylife/p/9079297.html