在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

  

最新文章

  1. Predicate&lt;T&gt;与Func&lt;T, bool&gt;泛型委托
  2. python视频教程大全集下载啦
  3. wx.html2.WebView在 target=&quot;_blank&quot; or rel=&quot;external&quot; 没有反映的解决方法
  4. Java工具类(获取当前主机操作系统名)
  5. WEB 容器、WEB服务和应用服务器的区别与联系
  6. python写的第一个简单小游戏-猜数字
  7. UVA 10057 A mid-summer night&#39;s dream. 仲夏夜之梦 求中位数
  8. 毕向东udp学习笔记1
  9. js存款计算器原生小demo
  10. MUI点击事件获取当前对象,及当前对象的属性值
  11. Smali语法汇总(二)
  12. 1.sklearn库的安装
  13. Azure Event Hub 技术研究系列1-Event Hub入门篇
  14. SQL 语法速记
  15. 分布式版本控制工具:git与Mercurial(zz)
  16. Swift5 语言指南(二十三) 协议
  17. Operating System Error Codes
  18. Expected BEGIN_ARRAY but was BEGIN_OBJECT
  19. zabbix监控日志文件
  20. swift 约束 - SnapKit 适配iPhoneX 安全区 和苹果自带的VFL ,auto layout 安全区适配

热门文章

  1. 如何替换vi的配色方案
  2. SpringBoot中的Quartz应用
  3. SQL 收集
  4. HDU 6148 Valley Numer (数位DP)题解
  5. ISSCC 2017论文导读 Session 14:A 0.62mW Ultra-Low-Power Convolutional-Neural-Network Face-Recognition Pro
  6. IntelliJ IDEA 设置代码提示或自动补全的快捷键(Alt+/)
  7. C#学习笔记(十七):委托、事件、观察者模式、匿名委托和lambert表达式
  8. 【转载】TCP 与 UDP 的区别
  9. css未知大小的图片居中
  10. 04_Windows平台Spark开发环境构建