javascript的replace之正则表达式的浅析
在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之正则表达式的浅析的更多相关文章
- JavaScript的replace方法与正则表达式结合应用讲解
大家好!!今晚在华软G43*宿舍没什么事做,把javascript中replace方法讲解一下,如果讲得不对或不合理是情理之中的事,因为我不是老鸟,也不是菜鸟,我也不知道我当底是什么鸟??呵~~ re ...
- Javascript语言精粹之正则表达式知识整理
Javascript语言精粹之正则表达式知识整理 1.正则表达式思维导图 2.正则表达式常用示例 2.1 移除所有标签,只留下innerText var html = "<p>& ...
- JavaScript:学习笔记(3)——正则表达式的应用
JavaScript:正则表达式的应用 应用正则表达式对象RegExp 创建正则表达式 JavaScript中使用RegExp对象来表述一个正则表达式.使用正则表达式之前首先要创建一个RegExp对象 ...
- JavaScript 表单验证正则表达式大全
JavaScript 表单验证正则表达式大全[转载] 匹配中文字符的正则表达式: [u4e00-u9fa5] 评注:匹配中文还真是个头疼的事,有了这个表达式就好办了 匹配双字节字符(包括汉字在内):[ ...
- javascript中replace使用总结
ECMAScript提供了replace()方法.这个方法接收两个参数,第一个参数可以是一个RegExp对象或者一个字符串,第二个参数可以是一个字符串或者一个函数.现在我们来详细讲解可能出现的几种情况 ...
- JavaScript中replace()方法的第二个参数解析
语法 string.replace(searchvalue,newvalue) 参数值 searchvalue 必须.规定子字符串或要替换的模式的 RegExp 对象.请注意,如果该值是一个字符串,则 ...
- 第179天:javascript中replace使用总结
ECMAScript提供了replace()方法.这个方法接收两个参数,第一个参数可以是一个RegExp对象或者一个字符串,第二个参数可以是一个字符串或者一个函数.现在我们来详细讲解可能出现的几种情况 ...
- JavaScript(九)正则表达式
RegExp 正则表达式 ,一般被创建出来就是用于 字符串的替换 查找方法中的 1.创建正则表达式 var reg = /pattern/flag; // 字面量 var reg = new RegE ...
- JavaScript中String对象的match()、replace() 配合正则表达式使用
正则表达式由来已久,查找替换功能非常强大,但模板难记复杂. JavaScript中String对象的match().replace()这2个方法都要使用正则表达式的模板.当模板内容与字符串不相匹配时, ...
随机推荐
- hdu Naive Operations 线段树
题目大意 题目链接Naive Operations 题目大意: 区间加1(在a数组中) 区间求ai/bi的和 ai初值全部为0,bi给出,且为n的排列,多组数据(<=5),n,q<=1e5 ...
- Hadoop Hive概念学习系列之hive里的分区(九)
为了对表进行合理的管理以及提高查询效率,Hive可以将表组织成“分区”. 分区是表的部分列的集合,可以为频繁使用的数据建立分区,这样查找分区中的数据时就不需要扫描全表,这对于提高查找效率很有帮助. 分 ...
- 【Coursera】Sixth Week(1)
Transport Layer 在学习完 Link Layer(Ethernet),Internetwork Layer(IP)之后,我们来到了TCP/IP协议簇的上半部分. Review:Magic ...
- wc的使用
统计文件个数 ls -l |grep "^-"|wc -l 统计目录的个数 ls -l|grep "^d"|wc -l 统计文件个数(包括子文件夹) ls -l ...
- html 绘制矩形轨迹,选中区域
<!doctype html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- phpmyadmin 定位表
一个数据库,里面有几百个表.如何快速定位需要的表呢? 关键字查询,就好了! 很方便,很实用. 建表的时候,相关性比较强的,就用同一个前缀.
- dataframe使用笔记
dates=pd.date_range(',periods=6) #创建固定频度的时间序列 df=pd.DataFrame(np.random.randn(6,4),index=dates,colum ...
- Redis 安装到linux系统
下载地址 : http://download.redis.io/releases/redis-3.0.3.tar.gz ). tar -zxvf redis-.tar.gz -C /usr/share ...
- ViewPager 如何得到当前的Fragment (使用FragmentPagerAdapter)
使用FragmentPagerAdapter时,难免要在MainActivity 和 当前显示的Fragment间传递数据.但是FragmentPagerAdapter并没有给我们提供类似getCur ...
- JDK1.5 新特性
1:自动装箱与拆箱 自动装箱:每当需要一种类型的对象时,这种基本类型就自动地封装到与它相同类型的包装中. 自动拆箱:每当需要一个值时,被装箱对象中的值就被自动地提取出来,没必要再去调用intValue ...