JavaScript中String的replace方法详解_js string replace-程序员宅基地

技术标签: JavaScript中的RegExp  regexp  string  前端  js  正则表达式  javascript  

String.prototype.replace()

replace()方法将一个字符串中被模式匹配的部分替换成新值,并返回这个替换后的新字符串对象。这个模式可以是一个字符串或者一个正则表达式,用于替换的新值可以是一个字符串或一个回调函数,这个回调函数在每次匹配成功时都会调用。如果模式是一个字符串,那只有第一次匹配时才会发生替换。replace()方法将返回一个新的字符串,原来的字符串不会发生任何变化。

var p = 'The quick brown fox jumps over the lazy dog. If the dog reacted, was it really lazy?';

var regex = /dog/gi;

console.log(p.replace(regex, 'ferret'));
// 输出: "The quick brown fox jumps over the lazy ferret. If the ferret reacted, was it really lazy?"

console.log(p.replace('dog', 'monkey'));
// 输出: "The quick brown fox jumps over the lazy monkey. If the dog reacted, was it really lazy?"

语法

str.replace(regexp|substr, newSubStr|function)

参数

regexp
一个正则表达式。匹配成功后将被newSubStr替换,或被function返回的值替换。
substr
一个字符串,匹配成功后将被newSubStr替换。只有第一次匹配时会被替换。
newSubStr
一个字符串,用于替换匹配项的新值。replace()函数内部为这个参数提供了一些特殊模式,详细描述见下文“描述”中的第一节“传入字符串作为参数”。
function
一个用于生成字符串的方法,生成的字符串将替换被模式匹配的项。这个方法是一个回调函数,他接收replace()函数内部传入的参数,详细描述见下文“描述”中的第二节“传入函数作为参数”。

返回值

函数返回一个新字符串,其中部分或全部匹配项被替换(根据入参而定)。

描述

String.prototype.replace()方法不会改变原有的字符串,他返回一个新的字符串。如果想要进行全局替换,那需要在入参的正则表达式中携带g修饰符。

传入字符串作为参数

String.prototype.replace()函数的第二个参数newSubStr可以是如下所示的特殊模式:

模式 对应的替换值
$$ 在替换位置插入”$”
$& 在替换位置插入匹配到的子字符串
$` 在替换位置插入在匹配到的字符串前面的子字符串
$’ 在替换位置插入在匹配到的字符串后面的子字符串
$n 如果n是一个正整数且n小于100,插入对应序号为n的捕获组,此时replace()函数的第一个参数必须为正则表达式。注意,捕获组第一项为$1,第二项为$2,以此类推

传入函数作为参数

String.prototype.replace()函数可以接收函数作为第二个参数。在这种情况下,当匹配成功时,回调函数将被调用。回调函数的返回值将用做替换值(注意,前文提到的newSubStr的特殊模式在回调函数中无效)。如果String.prototype.replace()函数的第一个参数是正则表达式并且有g修饰符,则String.prototype.replace()函数每次匹配成功时,都会调用一次回调函数。
传入回调函数的参数如下:

参数名 参数值
match 等同于匹配项的子字符串,对应于前文的$&
p1,p2,… 如果String.prototype.replace()函数的第一个参数为正则,则此项为对应的捕获组。举个例子,如果正则表达式为/(\a+)(\b+)/,那么p1就是\a+的匹配项,p2就是\b+的匹配项
offset 当前匹配项在整个字符串中的索引。举个例子,如果整个字符串是”abcd”,而匹配项是”bc”,那么offset就是1
string 调用String.prototype.replace()函数的整个字符串

回调函数中具体被传入的参数数量取决于String.prototype.replace()函数的第一个参数是否为正则表达式,以及该正则表达式中包含多少个捕获组:

function replacer(match, p1, p2, p3, offset, string) {
  // p1匹配非数字, p2匹配数字, p3匹配非字母非数字
  return [p1, p2, p3].join(' - ');
}
var newString = 'abc12345#$*%'.replace(/([^\d]*)(\d*)([^\w]*)/, replacer);
console.log(newString);  // 输出:abc - 12345 - #$*%

示例

在String.prototype.replac()函数中定义正则表达式

var str = 'Twas the night before Xmas...';
var newstr = str.replace(/xmas/i, 'Christmas');
console.log(newstr);  // Twas the night before Christmas...

在正则表达式中携带gi修饰符

想要使用replace()函数进行全局替换,参数必须是正则表达式并且有g修饰符。携带有g修饰符的正则表达式将会匹配字符串中所有出现的值。

var re = /apples/gi;
var str = 'Apples are round, and apples are juicy.';
var newstr = str.replace(re, 'oranges');
console.log(newstr);  // oranges are round, and oranges are juicy.

在字符串中旋转单词

var re = /(\w+)\s(\w+)/;
var str = 'John Smith';
var newstr = str.replace(re, '$2, $1');
console.log(newstr);  // Smith, John

使用内联函数来替换字符

在下面的代码中,程序将所有大写的英文字母替换成”连字符’-‘+小写字母”的形式。因此在这个场景中,我们需要拿到匹配项,将他转换为小写字符,再为他添加一个连字符,最终返回。

function styleHyphenFormat(propertyName) {
  function upperToHyphenLower(match, offset, string) {
    return (offset > 0 ? '-' : '') + match.toLowerCase();
  }
  return propertyName.replace(/[A-Z]/g, upperToHyphenLower);
}

styleHyphenFormat('borderTop');  //输出border-top

当使用replace()函数时,如果想要在替换之前对匹配项进行一些转换操作,必须使用回调函数的形式。如果没使用回调函数,对匹配项的操作将会不生效:

// 转换不会成功,输出borderTop
var newString = propertyName.replace(/[A-Z]/g, '-' + '$&'.toLowerCase());

'KaTeX parse error: Expected 'EOF', got '&' at position 1: &̲'.toLowerCase()…&’识别为一个普通字符串对象,这句代码将会原模原样的返回’KaTeX parse error: Expected 'EOF', got '&' at position 1: &̲’。之后,replace()函…&’识别为一个模式,即匹配到的字符串。

使用内敛函数代替for循环进行字符串检查

假设我们需要对字符串进行某种循环处理:一个x代表true;一个连字符-代表false;一个x后面跟下划线_,此时下划线可以多次出现,代表x的长度。要进行这种处理,可以使用字符串for循环,replace()函数同样可以完成这种工作:

var str = 'x-x_';
var retArr = [];
str.replace(/(x_*)|(-)/g, function(match, p1, p2) {
  if (p1) { retArr.push({ on: true, length: p1.length }); }
  if (p2) { retArr.push({ on: false, length: 1 }); }
});

console.log(retArr);

上面的代码展示了replace()函数如何实现一个for循环本可以完成的工作。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/yuhk231/article/details/88528839

智能推荐

java list(属性方法)_java list exists-程序员宅基地

文章浏览阅读1.2w次,点赞5次,收藏17次。List的方法和属性 方法或属性 作用Capacity 用于获取或设置List可容纳元素的数量。当数量超过容量时,这个值会自动增长。您可以设置这个值以减少容量,也可以调用trin()方法来减少容量以适合实际的元素数目。Count 属性,用于获取数组中当前元素数量Item( ) 通过指定索引获取或设置元素。对于List类来说,它是一个索引器。Add( ) 在List中添加一个对象的公有方法AddRan_java list exists

Golang单元测试和压力测试-程序员宅基地

文章浏览阅读1k次,点赞22次,收藏23次。go语言中的测试依赖go test命令。编写测试代码和编写普通的Go代码过程类似,并不需要学习新的语法,规则和工具。go test命令是一个按照一定约定和组织的测试代码的驱动程序。在包目录内,所有以_test.go为后缀名的源代码文件都是go test测试的一部分,不会被go build编译到最终可执行文件中。在*_test.go文件中有三种类型的函数,单元测试函数,基准测试函数和示例函数。

Python 的 Numpy 数值计算_numpy 数组中的值 分组计数-程序员宅基地

文章浏览阅读1k次,点赞4次,收藏5次。文章目录1. Numpy 介绍2. Numpy 数组2.1 介绍2.2 数组属性2.3 创建数组1. Numpy 介绍  Numpy(Numerical Python),是 Python 科学计算的基础包。Mumpy 主要提供了以下内容:快速高效的多维数组对象 ndarray。对数组执行元素级计算以及直接对数组执行科学计算的函数。线性代数、傅里叶变换及随机数生成的功能。将 C、C++..._numpy 数组中的值 分组计数

读写锁 优先级 linux,详谈Linux操作系统的三种状态的读写锁-程序员宅基地

文章浏览阅读885次。读写锁是另一种实现线程间同步的方式。与互斥量类似,但读写锁将操作分为读、写两种方式,可以多个线程同时占用读模式的读写锁,这样使得读写锁具有更高的并行性。读写锁的特性为:写独占,读共享;写锁优先级高。对于读写锁,掌握了这12个字就足矣了。Linux环境下,读写锁具有以下三种状态:读模式下加锁状态 (读锁)写模式下加锁状态 (写锁)不加锁状态虽然读写锁有读锁、写锁、不加锁三种状态,但其实它只有一把锁,..._读写锁 写优先

Java JSON 之 Map 转 JSON 字符串_java map 转字符串-程序员宅基地

文章浏览阅读1.2w次。http://www.verejava.com/?id=16998617072749下载依赖 jar 包 json.jar package com.json9;import java.util.HashMap;import java.util.Map;import org.json.JSONObject;public class Test{ public sta..._java map 转字符串

数据归一化(特征处理) 以及 各种归一化(BN-LN-GN-IN)的实现_数据中不同单位如何归一化-程序员宅基地

文章浏览阅读5.1k次,点赞3次,收藏15次。概述归一化:1. 把数据变成(0,1)或者(1,1)之间的小数。主要是为了数据处理方便提出来的,把数据映射到0~1范围之内处理,更加便捷快速。2. 把有量纲表达式变成无量纲表达式,便于不同单位或量级的指标能够进行比较和加权。归一化是一种简化计算的方式,即将有量纲的表达式,经过变换,化为无量纲的表达式,成为纯量。标准化:在机器学习中,我们可能要处理不同种类的资料,例如,音讯和图片上..._数据中不同单位如何归一化

随便推点

[开发|C++] 在 Ubuntu20.04系统上编译gcc-4.9.4_ubuntu20.04 gcc9.4.0编译gcc4.9.2-程序员宅基地

文章浏览阅读566次,点赞11次,收藏9次。5. 报错信息如下。7. 报错信息如下。_ubuntu20.04 gcc9.4.0编译gcc4.9.2

3小时零基础入门微信小程序开发2024年最新版-程序员宅基地

文章浏览阅读964次,点赞27次,收藏25次。用大白话讲:变量就是一个装东西的盒子再通俗些讲:变量就是用于存放数据的容器,我们通过变量名获取对应的数据。如上图所示,我们的盒子(变量)可以装名字,布尔类型的true,还可以用来装数字。变量的本质:就是在程序的内存中申请一块用来存放数据的空间。对象只是一种特殊的数据。对象是一组无序的相关属性和方法组成。这里重点要记住属性和方法这两个新概念属性:事物的特征,对象里的属性就是用来表现该对象具备哪些特征方法:事物的行为,对象里方法就是用来表示该对象具备哪些行为。

Bellman-Ford算法详讲_bellmanford算法不能处理什么情况-程序员宅基地

文章浏览阅读272次。Dijkstra算法是处理单源最短路径的有效算法,但它局限于边的权值非负的情况,若图中出现权值为负的边,Dijkstra算法就会失效,求出的最短路径就可能是错的。这时候,就需要使用其他的算法来求解最短路径,Bellman-Ford算法就是其中最常用的一个。该算法由美国数学家理查德•贝尔曼(Richard Bellman, 动态规划的提出者)和小莱斯特•福特(Lester Ford)发明。适_bellmanford算法不能处理什么情况

中国人必须知道的76个常识_中国人必须知道的常识-程序员宅基地

文章浏览阅读501次。1.【十二生肖】子鼠、丑牛、寅虎、卯兔、辰龙、巳蛇、午马、未羊、申猴、酉鸡、戌狗、亥猪2.【十大名茶】西湖龙井(浙江杭州西湖区)、碧螺春(江苏吴县太湖的洞庭山碧螺峰)、信阳毛尖(河南信阳车云山)、君山银针(湖南岳阳君山)、六安瓜片(安徽六安和金寨两县的齐云山)、黄山毛峰(安徽歙县黄山)、祁门红茶(安徽祁门县)、都匀毛尖(贵州都匀县)、铁观音(福建安溪县)、武夷岩茶(福建崇安县)3.【四大名绣】苏绣(苏州)_中国人必须知道的常识

MFC C++打造文件资源管理器(树控件版)_mfc 资源管理器-程序员宅基地

文章浏览阅读1.9k次,点赞3次,收藏23次。123_mfc 资源管理器

MySQL笔记_非单调的字段-程序员宅基地

文章浏览阅读421次。存储引擎MyISAM和InnoDB区别MyISAM是MySQL的默认数据库引擎(5.5版之前)。虽然性能极佳,而且提供了大量的特性,包括全文索引、压缩、空间函数等,但MyISAM不支持事务和行级锁,而且最大的缺陷就是崩溃后无法安全恢复。不过,5.5版本之后,MySQL引入了InnoDB(事务性数据库引擎),MySQL 5.5版本后默认的存储引擎为InnoDB。两者的对比:是否支持行级锁..._非单调的字段

推荐文章

热门文章

相关标签