语法

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

JavaScript中replace()方法的第二个参数解析的更多相关文章

  1. javascript中replace( )方法的使用——有博主已经讲过了,但里面有一小丢丢知识错误,挺重要的部分,我就重提下,以免初学者弄错

    阿里面试题:说出以下函数的作用是?空白区域应该填写什么? 其实这个问题http://www.phpstudy.net/b.php/105983.html解释的已经非常好了,思路也很顺,容易理解,本文将 ...

  2. JavaScript 中 replace方法 替换所有字符串

    需要替换一个字符串中所有的某个字符串 java中使用replaceAll()方法就可以了.但是JavaScript中没有replaceAll方法 但是可以通过以下方法实现: /** * 空格替换为下划 ...

  3. JavaScript的replace方法与正则表达式结合应用讲解

    大家好!!今晚在华软G43*宿舍没什么事做,把javascript中replace方法讲解一下,如果讲得不对或不合理是情理之中的事,因为我不是老鸟,也不是菜鸟,我也不知道我当底是什么鸟??呵~~ re ...

  4. JavaScript中的方法、方法引用和参数

    首先,我们来看一段代码,如果觉得不甚明白的,则本文会对你有益: var player = function (e) {             return (function f(m) {      ...

  5. 优雅的数组降维——Javascript中apply方法的妙用

    将多维数组(尤其是二维数组)转化为一维数组是业务开发中的常用逻辑,除了使用朴素的循环转换以外,我们还可以利用Javascript的语言特性实现更为简洁优雅的转换.本文将从朴素的循环转换开始,逐一介绍三 ...

  6. JavaScript中reduce()方法

    原文  http://aotu.io/notes/2016/04/15/2016-04-14-js-reduce/   JavaScript中reduce()方法不完全指南 reduce() 方法接收 ...

  7. 详解 JavaScript 中 splice() 方法

    splice() 方法是一个比较少用的方法,但是功能确实很好,并且在我们 coding 的时候,经常有需要 splice() 方法,先介绍一下该方法. 在 JavaScript 中 splice() ...

  8. JavaScript中Array方法总览

    title: JavaScript中Array方法总览 toc: true date: 2018-10-13 12:48:14 push(x) 将x添加到数组最后,可添加多个值,返回数组长度.改变原数 ...

  9. 数组降维-JavaScript中apply方法妙用

    海纳百川,有容乃大 1.普通循环转换方式 将多维数组(尤其是二维数组)转化为一维数组是业务开发中的常用逻辑,除了使用朴素的循环转换以外,我们还可以利用Javascript的语言特性实现更为简洁优雅的转 ...

随机推荐

  1. Alpha版本冲刺(九)

    目录 组员情况 组员1(组长):胡绪佩 组员2:胡青元 组员3:庄卉 组员4:家灿 组员5:凯琳 组员6:翟丹丹 组员7:何家伟 组员8:政演 组员9:黄鸿杰 组员10:刘一好 组员11:何宇恒 展示 ...

  2. Internet History, Technology and Security (Week 1)

    Week 1 History: Dawn of Electronic Computing Welcome to Week 1! This week, we'll be covering the ear ...

  3. 固态盘经常性蓝屏处理方法(WIN7/8)

    型号:intel 520S 大小;120G 我的是笔记本,这段时间辞职,有了时间折腾自己的电脑系统了,想装WIN8来着,PE下直接把固态盘的分区都干掉了,分了C,D(40G,剩下的空间),安装阶段完美 ...

  4. [转帖]Ubuntu 安装VNC的一个方法

    来源: https://blog.csdn.net/CSDN_duomaomao/article/details/75270271 Ubuntu 16.04 LTS 安装VNC,在百度和谷歌找了很多教 ...

  5. LinkedList,HashSet,HashMap

    LinkedList底层源码是采用双向链表实现的 private static class Node<E> { E item;//节点值 Node<E> next;//节点后指 ...

  6. scala 有 + 运算符吗? - 03

    scala 有运算符吗? 答案是没有. package com.msym /** * Created by ACER on 2017/7/4. */ object Demo { def main(ar ...

  7. document.execCommand & contenteditable

    document.execCommand & contenteditable https://developer.mozilla.org/zh-CN/docs/Web/API/Document ...

  8. 远程连接工具SSH和linux的连接

    实际开发中,Linux服务器都在其他的地方,我们要通过远程的方式去连接Linux并操作它,Linux远程的操作工具有很多,企业中常用的有Puttty.secureCRT.SSH Secure等.我使用 ...

  9. 简明Python教程自学笔记——命令行通讯录

    [前言]学习Python已经有一段时间了,相关的书籍资料也下载了不少,但是没有一本完整的看完,也没有编出一个完整的程序.今天下午比较清闲就把<简明Python教程>看了一遍,然后根据书里面 ...

  10. c++11 线程的互斥量

    c++11 线程的互斥量 为什么需要互斥量 在多任务操作系统中,同时运行的多个任务可能都需要使用同一种资源.这个过程有点类似于,公司部门里,我在使用着打印机打印东西的同时(还没有打印完),别人刚好也在 ...