详解JavaScript中的replace()函数

  Javascript中字符串对象有一个方法replace(),它的作用非常强大。这里把它的用法整理一下。

  一、方法简介

  该方法的签名是:replace([RegExp|String],[String|Function])。

  该方法 返回一个新的字符串,但并不改变字符串本身。

  该方法接收2个参数,第一个参数可以是字符串,也可以是一个正则表达式;第二个参数可以是一个字符串,也可以是一个函数。其中第2个参数如果是函数,那么用起来是十分强大而且灵活的,不过相对来说也比较难掌握。下面就其用法进行详细说明。

  二、基本用法  

  假如我们有一个字符串中出现了错别字”背景“,需要用”北京“来替换,那么我们可以如下搞定:

var str = "我爱背景天安门";
str = str.replace("背景","北京");
console.log(str); //输出结果:我爱北京天安门

  这个用法跟C#中的replace()用法别无二致,大家一看就明白。

  但是这个用法有个“坑”,看下例:

var str = "我爱背景天安门,但是背景雾霾太严重";
str = str.replace("背景","北京");
console.log(str); //输出结果:我爱北京天安门,但是背景雾霾太严重

  我们发现,如果字符串str中有多个待替换的子串,比如本例中的“背景”,出现了2次,那么replace()方法只能给我们用目标字符串(北京)替换掉第1次出现的"背景"。如果想把所有的"背景"都给替换了,就必须调用多次。这是我们不能接受的,因为我们无法预知原始字符串中出现了多少个错别字。

  幸好,replace()方法还提供了第二种用法,就是使用正则表达式。

  三、使用正则表达式

var str = "我爱背景天安门,但是背景雾霾太严重";
str = str.replace(/背景/g,"北京");
console.log(str); //输出结果:我爱北京天安门,但是北京雾霾太严重

  这里需要说明的是,str.replace(/背景/g,"北京")的第一个参数  ”/背景/g“ 是一个正则表达式,使用/  /的正则写法是JavaScript中正则表达式的字面量写法。在此处,正则表达式的末尾有个g,它表示match源字符串str中所有匹配项。这里如果没有g,那么也只能匹配到第一个错别字”背景“,只有加了这个g,才能匹配到所有的”背景“。

  四、正则表达式+function的用法

  以上的用法还是比较直观的,但是能实现的功能也比较简单,如果需要做一些复杂的字符串替换运算,那么就需要使用较为高级(复杂)的用法,就是  正则+function  的用法。说白了就是第一参数传一个正则表达式,我们下面称之为RegArg;第二个参数给一个函数,我们下面称之为FuncArg。这也是replace()的核心用法。

  讨论这个用法的前提,就是需要对JavaScript的Sring.match()有充分理解。不了解的,可以参考 详解正则表达式匹配方法match() 。

  这个用法的本质就是:对str使用RegArg做match()匹配,如果匹配到多项结果(比如使用了全局匹配g,或者分组),那么每一个匹配结果都将执行一次FuncArg函数,并且用该函数的返回值替代源字符串中的匹配项。

  这个用法复杂就复杂在这个FuncArg有不同的使用方式,下面做详细介绍。

  4.1简单用法,正则表达式不使用分组

var str = ‘我爱背景天安门,但是背景雾霾太严重‘;
var re = str.replace(/背景/, function(){
    console.log(arguments);
    return ‘北京‘;
})

  输出结果是

  

  解析:

  1. 本例的意图是:把源字符串中的‘背景’,替换为‘北京’。
  2. 正则表达式没有使用全局匹配符g,所以只替换了源字符串中第一个‘背景’子串,FuncArg只执行了一次
  3. 前面都不难理解,关键是:replace()函数,当第二个参数是一个函数时,这个函数是有参数的,而且这些参数是默认的。需要说明的是,当前这个例子比较简单,所以只有3个匹配项,
    • arguments[0]是匹配到的子字符串;
    • arguments[1]是匹配到的子串的索引位置
    • arguments[2]是源字符串本身

   4.本例如果想替换所有的‘背景’为‘北京’,只需要让正则表达式后加个g。代码我就不贴出来了,只贴出来输出结果。

  

  我们可以看到,输出了2个Arguments,因为我们使用全局匹配g后,会match到2个项,所以就执行了2次function。第一个跟前边一样,第二个arugments的索引位置是10,因为源字符串中第二个‘背景’的索引是10.

  如果就做这样的例子,你可能觉得还不如直接使用: str = str.replace(/背景/g,"北京"); 

  那么就再来一个例子,看看使用function做参数的好处。

  这个例子的意图是,把捐款是100元以下的金额数用‘**’来替换掉。

var txt =‘刘菲:50元。张常成:150元。孙玉杰:200元。李明轩:20元。李子豪:1500元。‘;
var txt = txt.replace(/\d+/g, function(){
    console.log(arguments);
    return arguments[0].length > 2 ? arguments[0] : ‘**‘;
})
console.log(txt);

  输出的结果是:

  

  我们可以看到,刘菲和李明轩的捐款被替换成 ** 了。

  4.2复杂用法,正则使用分组  

var txt =‘刘菲:5万。张常成:5000元。孙玉杰:2000元。李明轩:20万。李子豪:8500元。‘;
var txt = txt.replace(/(\d+)(万)/g, function(){
    console.log(arguments);
})
  1. 这个例子的意图是:把所有以“万”为单位的捐款,其金额改为‘元’。比如 :4万,改为40000元
  2. 这个例子只写了一半,目的是要研究下在正则表达式使用了分组以后arguments的变化
  3. 输出结果是:  

  仔细观察arguments结果集,明显比上一个例子多出2项。这些项分别是:  

  • arguments[0]是匹配到的子字符串;
  • arguments[1]是匹配到的第1个分组项
  • arguments[2]是匹配到的第2个分组项
  • arguments[3]是匹配到的字符串的索引位置
  • arguments[4]是源字符串本身

  这里正则有2个分组,所以多了匹配到的2个分组项;同理,如果有3个分组,就会多出3个匹配到的分组项。

  看懂了这个回调函数的arguments各项代表的意义,下面,我们就来真正的解决问题。  

var txt =‘刘菲:5万。张常成:5000元。孙玉杰:2000元。李明轩:20万。李子豪:8500元。‘;
var txt = txt.replace(/(\d+)(万)/g, function(){
    console.log(arguments);
    return arguments[1] + ‘0000‘ + ‘元‘;
})
console.log(txt);

  输出结果是:

  

  

原文地址:https://www.cnblogs.com/ldq678/p/9375185.html

时间: 2024-08-06 19:46:16

详解JavaScript中的replace()函数的相关文章

详解javascript中的this对象

详解javascript中的this对象 前言 Javascript是一门基于对象的动态语言,也就是说,所有东西都是对象,一个很典型的例子就是函数也被视为普通的对象.Javascript可以通过一定的设计模式来实现面向对象的编程,其中this "指针"就是实现面向对象的一个很重要的特性.但是this也是Javascript中一个非常容易理解错,进而用错的特性.特别是对于接触静态语言比较久了的同志来说更是如此. 示例说明 我们先来看一个最简单的示例: <script type=&q

举例详解Python中的split()函数的使用方法

这篇文章主要介绍了举例详解Python中的split()函数的使用方法,split()函数的使用是Python学习当中的基础知识,通常用于将字符串切片并转换为列表,需要的朋友可以参考下 函数:split() Python中有split()和os.path.split()两个函数,具体作用如下:split():拆分字符串.通过指定分隔符对字符串进行切片,并返回分割后的字符串列表(list)os.path.split():按照路径将文件名和路径分割开 一.函数说明1.split()函数语法:str.

详解JavaScript中的事件处理

在漫长的演变史,我们已经告别了内嵌式的事件处理方式(直接将事件处理器放在HTML元素之内来使用),今天的事件,它已是DOM的重要组成部分,遗憾的是,IE继续保留它最早在IE4.0中实现的事件模型,以后的IE版本中也没有做太大的改变,这也就是说IE还是使用的是一种专有的事件模型(冒泡型),而其它的主流浏览器直到DOM级别3规定定案后,才陆陆续续支持DOM标准的事件处理模型——捕获型与冒泡型. W3C规范在DOM级别1中并没有定义任何的事件,直到发布于2000年11月的DOM级别2才定义了一小部分子

详解JavaScript中的arc的方法

今天说说JavaScript在网页中画圆的函数arc! 一.arc所需要的参数设置 1 arc(x, y, radius, startAngle, endAngle, counterclockwise); 其中x,y,radius都很容易理解,那么重点说说startAngle,endAngle和counterclockwise三个参数!    二.arc参数详解 1,startAngle和endAngle分别指圆开始的角度和结束的角度,手册上面说的是开始的角度为0,结束的角度为Math.PI*2

【转】详解JavaScript中的异常处理方法

有三种类型的编程错误:(1)语法错误和(2)运行时错误(3)逻辑错误:语法错误: 语法错误,也被称为解析错误,在编译时进行传统的编程语言,并出现在JavaScript解释时. 例如,下面一行将导致一个语法错误,因为它缺少一个右括号: <script type="text/javascript"> <!-- window.print(; //--> </script> 当一个语法错误在JavaScript中出现,只有在同一个线程中包含的语法错误的影响,

javascript中通过replace函数搜索和替换指定字符串

javascript中我们可以通过replace函数替换部分字符串为指定字符串,本文展示了replace的详细用法,并且通过范例演示了如何进行部分替换.完整替换和不区分大小写替换. javascript中我们可以通过replace函数替换部分字符串为指定字符串.下面是replace函数的基本语法: str_var.replace("search_string", "replace_string") 下面看一个简单的范例: <script type="

详解JavaScript中的Url编码/解码,表单提交中网址编码

本文主要针对URI编解码的相关问题做了介绍,对Url编码中哪些字符需要编码.为什么需要编码做了详细的说明,并对比分析了Javascript 中和 编解码相关的几对函数escape / unescape,encodeURI / decodeURI和 encodeURIComponent / decodeURIComponent. 预备知识 foo://example.com:8042/over/there?name=ferret#nose \_/ \______________/ \_______

详解JavaScript中的this

JavaScript中的this总是让人迷惑,应该是js众所周知的坑之一. 个人也觉得js中的this不是一个好的设计,由于this晚绑定的特性,它可以是全局对象,当前对象,或者…有人甚至因为坑大而不用this. 其实如果完全掌握了this的工作原理,自然就不会走进这些坑.来看下以下这些情况中的this分别会指向什么: 1.全局代码中的this alert(this)//window 全局范围内的this将会指向全局对象,在浏览器中即使window. 2.作为单纯的函数调用 function f

详解Javascript中的Object对象

Object是在javascript中一个被我们经常使用的类型,而且JS中的所有对象都是继承自Object对象的.虽说我们平时只是简单地使用了Object对象来存储数据,并没有使用到太多其他功能,但是Object对象其实包含了很多很有用的属性和方法,尤其是ES5增加的方法,因此,本文将从最基本的介绍开始,详细说明了Object的常用方法和应用. 基础介绍 创建对象 首先我们都知道,对象就是一组相似数据和功能的集合,我们就是用它来模拟我们现实世界中的对象的.那在Javascript中,创建对象的方