在javascript中,字符串的replace方法可以指定替换某些字符串。

1、直接替换字符串

"yy/MM/dd".replace("yy","2017");//替换后,原字符串变为2017/MM/dd

这是直接指定将原字符串中的yy替换为2017。

2、指定用函数返回值替换原指定字符串

"yy/MM/dd".replace("yy",function(){return "2017";});//替换后,原字符串变为2017/MM/dd

这是用函数返回值2017替换原字符串中的yy。

3、用正则表达式指定需要被替换的源字符串

"yy/MM/dd".replace(/yy/,"2017");

看了上面最简单的,咱来一个比较复杂的。看下面的代码:

Date.prototype.format = function(e) {
var t = this,
n = Date._formators;
return n || (Date._formators = n = {
y: function(e, t) {
return e = e.getFullYear(),
e < 0 ? "BC" + -e: t < 3 && e < 3e3 ? e % 100 : e
},
M: function(e) {
return e.getMonth() + 1
},
d: function(e) {
return e.getDate()
},
H: function(e) {
return e.getHours()
},
m: function(e) {
return e.getMinutes()
},
s: function(e) {
return e.getSeconds()
},
e: function(e, t) {
return (t === 1 ? "": t === 2 ? "周": "星期") + [t === 2 ? "日": "天", "一", "二", "三", "四", "五", "六"][e.getDay()]
}
}), //这个逗号是用来干啥的?为何括号之间会有这个逗号?
(e || "yyyy/MM/dd HH:mm:ss").replace(/(\w)\1*/g,
function(e, r) {//这个function是怎么来的
if (r in n) {
r = "" + n[r](t, e.length);
while (r.length < e.length) r = "0" + r;
e = r
}
return e
})
}

上面这块代码对于新手来说,看着比较复杂,为啥括号之间会有逗号?为啥正则表达式(\w)后会有\1*?replace函数的第二个参数function(e,r)是怎么来的,为何这个function会有两个参数,这两个参数到底是什么意思?估计这些是新手最想问的。别急,接下来会一一讲解这些问题。

一、括号之间为何会有逗号?

这个属于逗号运算符。逗号运算符的的运算规则是自左向右运算,并返回最后一个表达式的值。

如:var data=(x=2,x*3,x*5);

上面这个表达式中,最先计算括号里面的值。括号里面的运算规则就是根据逗号运算符的规则去计算的,自左向右计算。首先计算x=2,第二个参数为6,第三个参数为10。data就是最后的一个参数值10。

二、正则表达式(\w)后面的\1*是什么意思?

\1表示重复正则第一个圆括号内匹配到的内容,\2表示重复正则第二个圆括号内匹配到的内容,如果有嵌套的圆括号,顺序是按左括号的次序计算的。星号*是匹配零个或多个。

即"yy/MM/dd".replace(/(\w)/,"1"),这个\w首先匹配字符y,则最终的结果为"1y/MM/dd",如果是"yy/MM/dd".replace(/(\w)\1/,"1"),则最终的结果是"11/MM/dd",\1就是多匹配一个(\w)这个参数。按照这样来看,则"ybyb/MM/dd".replace(/(\w)(\w)\1\2/,"2")的结果为"2/MM/dd"。

三、replace函数的第二个参数function(e,r)是怎么来的,为何这个function会有两个参数,这两个参数到底是什么意思?

这个函数应该是replace函数里面自带的,但是需要外面传一个实体方法进去。e传入的参数值为整个匹配的结果,如:yyyy。r传入的参数为(\w)匹配的结果,如:y。如果在正则表达式后有g的话,那就是对整个字符串进行匹配并替换,有多少个匹配就循环多少次替换操作。如下面的代码所示:

var obj={
y:1,
M:2,
d:3
};
var source="yyyy/MM/dd".replace(/(\w)\1*/g,function(word,element){
if(element in obj){
word=obj[element].toString();
}
return word;
});
document.write(source); //对正则表达式进行了循环匹配,所以结果为:1/2/3

  

javascript的replace之正则表达式的浅析的更多相关文章

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

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

  2. Javascript语言精粹之正则表达式知识整理

    Javascript语言精粹之正则表达式知识整理 1.正则表达式思维导图 2.正则表达式常用示例 2.1 移除所有标签,只留下innerText var html = "<p>& ...

  3. JavaScript:学习笔记(3)——正则表达式的应用

    JavaScript:正则表达式的应用 应用正则表达式对象RegExp 创建正则表达式 JavaScript中使用RegExp对象来表述一个正则表达式.使用正则表达式之前首先要创建一个RegExp对象 ...

  4. JavaScript 表单验证正则表达式大全

    JavaScript 表单验证正则表达式大全[转载] 匹配中文字符的正则表达式: [u4e00-u9fa5] 评注:匹配中文还真是个头疼的事,有了这个表达式就好办了 匹配双字节字符(包括汉字在内):[ ...

  5. javascript中replace使用总结

    ECMAScript提供了replace()方法.这个方法接收两个参数,第一个参数可以是一个RegExp对象或者一个字符串,第二个参数可以是一个字符串或者一个函数.现在我们来详细讲解可能出现的几种情况 ...

  6. JavaScript中replace()方法的第二个参数解析

    语法 string.replace(searchvalue,newvalue) 参数值 searchvalue 必须.规定子字符串或要替换的模式的 RegExp 对象.请注意,如果该值是一个字符串,则 ...

  7. 第179天:javascript中replace使用总结

    ECMAScript提供了replace()方法.这个方法接收两个参数,第一个参数可以是一个RegExp对象或者一个字符串,第二个参数可以是一个字符串或者一个函数.现在我们来详细讲解可能出现的几种情况 ...

  8. JavaScript(九)正则表达式

    RegExp 正则表达式 ,一般被创建出来就是用于 字符串的替换 查找方法中的 1.创建正则表达式 var reg = /pattern/flag; // 字面量 var reg = new RegE ...

  9. JavaScript中String对象的match()、replace() 配合正则表达式使用

    正则表达式由来已久,查找替换功能非常强大,但模板难记复杂. JavaScript中String对象的match().replace()这2个方法都要使用正则表达式的模板.当模板内容与字符串不相匹配时, ...

随机推荐

  1. Python的递归

    递归 是指函数/过程/子程序在运行过程序中直接或间接调用自身而产生的重入现象.在计算机编程里,递归指的是一个过程:函数不断引用自身,直到引用的对象已知.使用递归解决问题,思路清晰,代码少.但是在主流高 ...

  2. Makefile使用总结【转】

    1. Makefile 简介 Makefile 是和 make 命令一起配合使用的. 很多大型项目的编译都是通过 Makefile 来组织的, 如果没有 Makefile, 那很多项目中各种库和代码之 ...

  3. 【第三十章】 elk(1) - 第一种架构(最简架构)

    软件版本: es:2.4.0 logstash:2.4.0 kibana:4.6.1 一.logstash安装(收集.过滤日志.构建索引) 1.下载:https://www.elastic.co/do ...

  4. RMQ 区间最大值 最小值查询

    /*RMQ 更新最小值操作 By:draymonder*/ #include <iostream> #include <cstdio> using namespace std; ...

  5. WebApi——json返回多了 k_BackingField

    产生原因: model类添加了    [System.Serializable] 解决方案: xxxxx.WebApi\App_Start\WebApiConfig.cs的Register函数中添加如 ...

  6. LA 4080 战争和物流(最短路树)

    https://vjudge.net/problem/UVALive-4080 题意:给出一个n个结点m条边的无向图,每条边上有一个正权.令c等于每对结点的最短路长度之和.不连通的两点的最短路长度视为 ...

  7. spring +servlet 与 spring MVC

    spring serlvetSpring框架中context-param与servlet中init-param的contextConfigLocation的区别https://blog.csdn.ne ...

  8. Python matplot画柱状图(一)

    图的存在,让数据变得形象化.无论多么复杂的东西,都是简单的组合. import matplotlib.pyplot as plt import numpy as np dict = {'A': 40, ...

  9. MAC下Java安装之后的路径

    pwd /Library/Java/JavaVirtualMachines/jdk1.8.0_171.jdk/Contents/Home 安装好jdk之后,就开始配置环境变量了. 首先,在终端输入 s ...

  10. Java并发编程:Callable、Future和FutureTask(转)

    Java并发编程:Callable.Future和FutureTask 在前面的文章中我们讲述了创建线程的2种方式,一种是直接继承Thread,另外一种就是实现Runnable接口. 这2种方式都有一 ...