在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. 如何替换vi的配色方案

    答: 1.获取配色方案 git clone git://github.com/altercation/vim-colors-solarized.git ~/.vim/bundle/vim-colors ...

  2. <OFFER03>03_01_DuplicationInArray

    #include<cstdio> bool duplicate(int numbers[], int length, int* duplication) { ) return false; ...

  3. ISSCC 2017论文导读 Session 14:ENVISION: A 0.26-to-10 TOPS/W Subword-Parallel DVAFS CNN Processor in 28nm

    ENVISION: A 0.26-to-10 TOPS/W Subword-Parallel Dynamic-Voltage-Accuracy-Frequency-Scalable CNN Proce ...

  4. [shiro] - 加入rememberMe功能

    shiro不加入rememberMe没事,一加入就出错. RememberMeAuthenticationToken : public interface RememberMeAuthenticati ...

  5. UVa 10340 子序列

    https://vjudge.net/problem/UVA-10340 题意: 输入两个字符串s和t,判断是否可以从t中删除0个或多个字符得到字符串s. 思路: 很水的题... #include&l ...

  6. 模拟C#的事件添加和删除

    从<C# Via CLR>中的演化的一个小demo,探索事件的添加和删除原理,简单明了: using System; using System.Collections.Generic; u ...

  7. 搜索:ElasticSearch OR MySQL?

    背景 我们开发一般的企业级Web应用,其实从本质上来说,都是对数据的增删查改进行各个维度的包装.所以说,不管你的程序如何开发,基本上,都离不开数据本身.那么,在开发企业级应用的过程中,很多同学一定遇到 ...

  8. 《剑指offer》第二十六题(树的子结构)

    // 面试题26:树的子结构 // 题目:输入两棵二叉树A和B,判断B是不是A的子结构. #include <iostream> struct BinaryTreeNode { doubl ...

  9. Myeclise下tomcat启动报错,启动超时

    错误截图如下: 大概说的是tomcat7在本地不能在45秒内启动,如果项目需要更多的时间,试着去更改server配置 解决方法: 找到项目工作空间目录下 workspace\.metadata\.pl ...

  10. 慕课网Hibernate初探之一对多映射实验及总结

    慕课网Hibernate初探之一对多映射实验及总结 一.本课核心 * 1.如何在MyEclipse中使用Hibernate * 2.如何实现Hibernate中一对多的映射 * 3.如何创建Sessi ...